Consul服務注冊發(fā)現(xiàn)與Fabio反向代理

Consul服務注冊發(fā)現(xiàn)

Consul是一個輕量級的服務注冊與發(fā)現(xiàn)工具, 支持集群, 支持k/v存儲, 支持對服務的健康檢查. 同類工具有etcd, zookeeper等..

二進制安裝

https://releases.hashicorp.com/consul/1.2.2/consul_1.2.2_linux_amd64.zip
下載并解壓, 然后拷貝二進制文件到 /usr/local/bin


快速啟動consul

開發(fā)模式啟動consul是最快的方式
consul agent -dev -config-dir=/etc/consul -bind=0.0.0.0 -client=0.0.0.0

參數(shù)說明

  • agent -- 使用agent模式跑起來
  • -dev -- 使用開發(fā)模式啟動agent
  • -config-dir -- 配置文件目錄, 這里存放json文件以文件的形式注冊服務
  • -bind=0.0.0.0 -- 綁定集群通訊的ip地址, 默認是127.0.0.1
  • -client=0.0.0.0 -- 綁定客戶端API,DNS等服務監(jiān)聽的地址, 默認是127.0.0.1

Consul主配置文件

/etc/consul/config.json

{
    "acl_datacenter": "aliyun", # 開啟ACL必選 數(shù)據(jù)中心名稱, 表示啟用acl的數(shù)據(jù)中心, all表示所有數(shù)據(jù)中心
    "acl_default_policy": "deny", # 可選 默認為allow, 所有操作都允許 改為deny即表示開啟acl(既白名單模式), 第一次啟動consul請勿配置deny否則自己進不去
    "acl_master_token": "5d79de96-106f-11e7-9381-005056abff5a", # 開啟ACL必選 這個token必須是uuid格式, 任何可生成uuid的工具生成, 在訪問API時必須帶上此uuid, 包括UI界面, UI界面點擊右側的setting進入后, 在ACL TOKEN中填入acl_master_token的值, 點擊save 即可配置ACL
    "bootstrap_expect": 2, # 在一個datacenter中期望提供的server節(jié)點數(shù)目撕攒,當該值提供的時候,consul一直等到達到指定sever數(shù)目的時候才會引導整個集群,該標記不能和bootstrap公用
    "client_addr": "0.0.0.0",
    "bind_addr": "0.0.0.0",
    "advertise_addr": "192.168.1.200", # 當服務器有多個私網(wǎng)IP時, 必須指定一個IP作為集群通信IP, 需要個bind_addr一起使用
    "data_dir": "/opt/consul",
    "datacenter": "aliyun", # 數(shù)據(jù)中心名稱
    "dns_config": { # DNS發(fā)現(xiàn)功能的配置
        "allow_stale": true,
        "enable_truncate": true,
        "node_ttl": "60s",
        "service_ttl": {
            "*": "5s"
        }
    },
    "enable_script_checks": true, # 允許服務使用腳本進行健康檢查
    "encrypt": "NnKESxGToysca68P7FM2sA==", # consul的server和client通信秘鑰 使用consul keygen創(chuàng)建, 不管server還是client都要這個參數(shù)和相同的值
    "log_level": "INFO", # 日志記錄等級
    "node_name": "consulServer1", # 本節(jié)點名稱
    "server": true, # consul以server模式啟動
    "ui": true # 啟用UI界面
}

注: 關于ACL的配置還有:

Consul的CLI啟動參數(shù)絕大部分都也可以配置在config.json中, 但有些參數(shù)在json中配置時名稱和cli中使用有所不同
詳見官方文檔 https://www.consul.io/docs/agent/options.html#configuration-files


Consul監(jiān)聽的端口

協(xié)議 端口 說明
tcp 8300 Server 服務器節(jié)點與集群通訊
tcp 8301 Cluster LAN -- 集群sever間通信
udp 8301 Cluster LAN -- 集群sever間通信
tcp 8302 Cluster WAN -- 集群sever間通信
udp 8302 Cluster WAN -- 集群sever間通信
tcp 8500 Client HTTP Server -- 節(jié)點對外HTTP服務
tcp 8600 Client DNS Server(TCP) -- 節(jié)點對外DSN服務
udp 8600 Client DNS Server(UDP) -- 節(jié)點對外DNS服務

這些端口在config.json或者啟動參數(shù)中都是可以修改的


本地json文件服務注冊

/etc/consul/web.json

{
    "service": {
        "checks": [ # 健康檢查配置
            {
                "tcp": ":80", # 檢查模式, tcp, http, https, script幾種模式, :80表示訪問本機任何ip的80端口
                "interval": "5s",
                "timeout": "1s"
            }
        ],
        "id": "web-1", # 服務id
        "name": "web-1", # 服務名稱
        "port": 80 , # 服務端口
        "tags": [ # 標簽
            "urlprefix-/web" # 給fabio使用的標簽, 后面會詳細說
        ]
    }
}

Consul的UI界面

cli方式啟動時必須 -ui 啟動UI界面
config.json方式配置時需要增加 { "ui": ture }才能啟動UI界面
http://x.x.x.x:/8500/ui 可以進入UI界面

image.png

服務健康檢查

常見的有http, script, tcp等, 同一個服務可以有多種檢查方法,例如:

{
  "checks": [
    {
      "id": "chk1",
      "name": "mem",
      "args": ["/bin/check_mem", "-limit", "256MB"], # 帶參數(shù)的script類型檢查
      "interval": "5s",
      "timeout": "1s"
    },
    {
      "id": "chk2",
      "name": "/health",
      "http": "http://localhost:5000/health", # http類型檢查
      "tls_skip_verify": false,
      "method": "POST",
      "header": {"x-foo":["bar", "baz"]},
      "interval": "15s",
      "timeout": "1s"
    },
    {
      "id": "chk3",
      "name": "cpu",
      "script": "/bin/check_cpu", # 不帶參數(shù)的script檢查
      "interval": "10s"
    },
    ...
  ]
}

更多健康檢查方法和參數(shù)詳見官方文檔
https://www.consul.io/docs/agent/checks.html


ConsulAPI

請參見 官方文檔 https://www.consul.io/api/agent.html


Consul集群配置

Consul集群配置要注意幾點:

  • ACL 權限要配好, 不然權限不足會導致servers/clients之間不能通信
  • encrypt 所有server, client節(jié)點的通信秘鑰必須一致

手動加入集群方法

[root@localhost ~]# consul join 192.168.1.xxx
Successfully joined cluster by contacting 1 nodes.

自動加入集群方法

  • consul agent CLI方式啟動參數(shù) -retry-join="192.168.1.1 192.168.1.2 192.168.1.3"
  • config.json配置文件方式啟動參數(shù) { "retry_join": ["192.168.1.1", "192.168.1.2","192.168.1.3"] }
    注: retry-join參數(shù)允許失敗, 未指定重試次數(shù)和間隔將永遠嘗試, 直到成功未知

Consul ACL訪問控制列表

如何進入ACL管理界面?
1.打開UI界面
2.點擊導航欄右側的Settings
3.將consul配置文件中的 acl_master_token拷貝粘貼到web界面中的ACL TOKEN
4.點擊Save按鈕
5.再點擊導航欄中的ACL菜單

UI界面配置訪問的Token

創(chuàng)建ACL策略
策略內容

key "" {                # 針對訪問k/v存儲的策略
   policy = "read" # 只讀
}
service "fabio-" { # 針對訪問服務的策略(僅針對以"fabio-"開頭命名的服務
    policy = "write" # 可讀可寫
}
service "" { # 針對訪問服務的策略 (所有服務)
    policy = "read" # 可讀
}
node "" { # 針對訪問節(jié)點信息的策略 (所有節(jié)點)
    policy = "read" # 可讀
} 
agent "" { # 針對訪問agent代理信息的策略 (所有agent)
    policy = "read" # 可讀
}
session "" { 
    policy = "write"
}

UI界面創(chuàng)建ACL策略示例


創(chuàng)建ACL策略
策略對象 說明
agent Agent API中的實用程序操作椿每,而不是服務和檢查注冊
event Event API中檢索時間和觸發(fā)事件
key KV Store API中的鍵/值存儲操作
keyring 密鑰環(huán)API中的密鑰環(huán)操作
node Catalog API袭厂,Health API朝墩,Prepared Query API嫂伞,Network Coordinate APIAgent API中的節(jié)點級目錄操作
operator Keyring API之外的Operator API中的集群級操作
query 發(fā)現(xiàn)查詢的查詢操作
service Catalog API送漠,Health API笋籽,Prepared Query APIAgent API中的服務級目錄操作
session 會話API操作

ACL策略類型

  • read 只讀
  • write 讀寫
  • deny 不能讀也不能寫

API操作ACL詳見官方API文檔 https://www.consul.io/docs/guides/acl.html#rule-specification


Network Segments 網(wǎng)格

待完善


Consul 監(jiān)控

待完善


Fabio反向代理

Fabio是為consul而生的一個反向代理服務器, 支持負載均衡, http, https, tcp等. 你可以把它想象成nginx, 與nginx不同的是fabio可以根據(jù)consul服務的tag來進行自動轉發(fā)請求

安裝Fabio

首先需要安裝git 和go環(huán)境 使用yum安裝即可
# yum -y install git golang

獲取fabio
# go get github.com/eBay/fabio

拷貝fabio二進制文件到彬bin目錄
# cp go/bin/fabio /usr/local/bin/

拷貝配置文件到etc目錄
# cp go/src/github.com/eBay/fabio/fabio.properties /etc/

/etc/fabio.properties常見配置

proxy.addr = :9999 # fabio代理監(jiān)聽端口
proxy.localip = # 代理監(jiān)聽的本地ip地址, 默認是空也就是0.0.0.0
proxy.strategy = rnd # 代理策略 rr(輪訓)和rnd(基于微秒時間隨機分配)
proxy.matcher = prefix # fabio反代請求給consul的匹配方式, prefix是使用uri前綴匹配, glob是使用通配符匹配(通配符不是正則表達式哦, 雖然有些相通)
proxy.maxconn = 10000 # 緩存的連接數(shù)
registry.consul.addr = localhost:8500 # fabio 去個consul服務注冊自己? 一般指定任意一個client的8500端口即可
registry.consul.token = # fabio去consul注冊自己時, 需要使用的token(當consul啟用了acl才需要)
registry.consul.kvpath = /fabio/config # fabio在consul的k/v數(shù)據(jù)庫中寫入數(shù)據(jù)的路徑
# fabio轉發(fā)請求到consul時, 如果使用prefix策略, 則需要指定前綴是啥
# 比如 當請求fabio地址http://fabio_ip:9999/urlprefix-/webService 
# fabio將會把請求轉發(fā)到consul中tag為"urlprefix-/webService"的服務
# 也就是說"urlprefix-"是fabio和consule服務注冊者在consul注冊服務打標簽時約定的標簽前綴
registry.consul.tagprefix = urlprefix-

fabio還有很多關于反代的參數(shù), 比如代理https時使用的證書, http頭的修改等等配置, 詳情參見官方文檔 https://fabiolb.net/ref/


自定義代理路由

fabio默認會按照proxy.matcher配置的匹配方法自動向consul轉發(fā)請求, 當然也可以自定義路由進行轉發(fā)

如何配置自定義轉發(fā)路由規(guī)則?
登陸consul的UI界面, 在Key/Value中創(chuàng)建
Key:
fabio/config
Value:
route add serviceName1 /abc http://192.168.1.1/
如下圖所示

新增自定義轉發(fā)路由

轉發(fā)的路由規(guī)則語法請參見官方文檔
https://fabiolb.net/cfg/

查看Fabio路由表
http://fabio_ip:9998/routes

Fabio路由表: 其中第1條是fabio自動轉發(fā)的路由, 第2條是我們自定義的路由規(guī)則

路由有各種Option, 這些Option在add route自定義路由或consul注冊服務時都需要注意

比如consul注冊如下服務時:

{
    "service": {
        "checks": [
            {
                "tcp": ":443",
                "interval": "5s",
                "timeout": "1s"
            }
        ],
        "id": "web-2",
        "name": "web-2",
        "port": 443 ,
        "tags": [
            "urlprefix-/web2, proto=https, tlsskipverify=true"
        ]
    }
}

consul注冊服務時已定義好如果fabio向自己轉發(fā)請求時自己應該告訴fabio些什么:

  • urlprefix-/web2: 當用戶請求fabio(你)的uri前綴是"/urlprefix-/web2"的時候才轉發(fā)到consul(我)這個服務(注意urlprefix-/web2在tag里時前面時沒有/的)
  • proto=https:consul(我)的這個服務是https的
  • tlsskipverify=true:fabio(你)在訪問consul(我)的這個服務時請?zhí)^證書檢查

比如在fabio新增一個路由時:
route add web2 /web2 https://x.x.x.x:8080/ opts "proto=https, tlsskipverify=true"
這個自定義路由是fabio告訴自己, 當匹配到uri為/web2的請求時, 應該將請求轉發(fā)的目標是什么, 轉發(fā)給目標時需要哪些參數(shù):

  • proto=https 目標是https協(xié)議
  • tlsskipverify=true 轉發(fā)給目標時, 忽略目標的ssl證書檢查
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末浩姥,一起剝皮案震驚了整個濱河市脱衙,隨后出現(xiàn)的幾起案子蘸吓,更是在濱河造成了極大的恐慌善炫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件库继,死亡現(xiàn)場離奇詭異箩艺,居然都是意外死亡,警方通過查閱死者的電腦和手機制跟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門舅桩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人雨膨,你說我怎么就攤上這事擂涛。” “怎么了聊记?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵撒妈,是天一觀的道長。 經(jīng)常有香客問我排监,道長狰右,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任舆床,我火速辦了婚禮棋蚌,結果婚禮上,老公的妹妹穿的比我還像新娘挨队。我一直安慰自己谷暮,他們只是感情好,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布盛垦。 她就那樣靜靜地躺著湿弦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪腾夯。 梳的紋絲不亂的頭發(fā)上颊埃,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天蔬充,我揣著相機與錄音,去河邊找鬼班利。 笑死饥漫,一個胖子當著我的面吹牛,可吹牛的內容都是我干的肥败。 我是一名探鬼主播趾浅,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愕提,長吁一口氣:“原來是場噩夢啊……” “哼馒稍!你這毒婦竟也來了?” 一聲冷哼從身側響起浅侨,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤纽谒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后如输,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼓黔,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年不见,在試婚紗的時候發(fā)現(xiàn)自己被綠了澳化。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡稳吮,死狀恐怖缎谷,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情灶似,我是刑警寧澤列林,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站酪惭,受9級特大地震影響希痴,放射性物質發(fā)生泄漏。R本人自食惡果不足惜春感,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一砌创、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鲫懒,春花似錦嫩实、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谦秧,卻和暖如春竟纳,著一層夾襖步出監(jiān)牢的瞬間撵溃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工锥累, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缘挑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓桶略,卻偏偏與公主長得像语淘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子际歼,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內容