Consul
Consul是一個註冊與發現的服務, 並且支援健全狀態檢查
二進位安裝
https://releases.hashicorp.com/consul/1.2.2/consul_1.2.2_linux_amd64.zip
下載並解壓, 然後拷貝二進位檔案到 /usr/local/bin
啟動consul
開發模式啟動consul
consul agent -dev -config-dir=/etc/consul -bind=0.0.0.0 -client=0.0.0.0
參數說明
agent -- 使用agent模式跑起來-dev -- 使用開發模式啟動agent-config-dir -- 設定檔目錄, 這裡存放json檔案以檔案的形式註冊服務-bind=0.0.0.0 -- 綁定叢集通訊的ip地址, 預設是127.0.0.1-client=0.0.0.0 -- 綁定用戶端API,DNS等服務監聽的地址, 預設是127.0.0.1
Consul主設定檔
/etc/consul/config.json
{ "acl_agent_token": "c3591489-a756-019a-e97f-87f867ece12c", "acl_datacenter": "aliyun", # 資料中心名稱 "acl_default_policy": "deny", # acl預設策略 "acl_master_token": "5d79de96-106f-11e7-9381-005056abff5a", "bootstrap_expect": 2, "client_addr": "0.0.0.0", "data_dir": "/opt/consul", "datacenter": "aliyun", "dns_config": { # DNS發現功能的配置 "allow_stale": true, "enable_truncate": true, "node_ttl": "60s", "service_ttl": { "*": "5s" } }, "enable_script_checks": true, # 允許服務使用指令碼進行健全狀態檢查 "encrypt": "NnKESxGToysca68P7FM2sA==", # consul的server和client通訊秘鑰 使用consul keygen建立, 不管server還是client都要這個參數和相同的值 "log_level": "INFO", # 日誌記錄模式 "node_name": "monitor", # 本節點名稱 "server": true # consul以server模式啟動}
consul的配置參數大部分都可以使用啟動參數和config.json方式兩種方式
詳見文檔 https://www.consul.io/docs/agent/options.html
服務註冊json配置 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監聽連接埠
協議 連接埠tcp 8300 -- 伺服器節點與叢集通訊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 -- 節點對外HTTP服務tcp 8600 Client DNS Server(TCP) -- 節點對外DSN服務udp 8600 Client DNS Server(UDP) -- 節點對外DNS服務
這些連接埠在config.json或者啟動參數中都是可以修改的
Consul的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"], # 帶參數的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", # 不帶參數的script檢查 "interval": "10s" }, ... ]}
更多健全狀態檢查方法和參數詳見官方文檔
https://www.consul.io/docs/agent/checks.html
ConsulAPI
請參見 官方文檔 https://www.consul.io/api/agent.html
Consul叢集配置
Fabio反向 Proxy
Fabio是為consul而生的一個反向 Proxy伺服器, 支援負載平衡, http, https, tcp等. 你可以把它想象成nginx, 與nginx不同的是fabio可以根據consul服務的tag來進行自動轉寄請求
安裝Fabio
首先需要安裝git 和go環境 使用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代理監聽連接埠proxy.localip = # 代理監聽的本地ip地址, 預設是空也就是0.0.0.0proxy.strategy = rnd # Proxy 原則 rr(輪訓)和rnd(基於微秒時間隨機分配)proxy.matcher = prefix # fabio反代請求給consul的匹配方式, prefix是使用uri首碼匹配, glob是使用萬用字元匹配(萬用字元不是Regex哦, 雖然有些相通)proxy.maxconn = 10000 # 緩衝的串連數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資料庫中寫入資料的路徑# fabio轉寄請求到consul時, 如果使用prefix策略, 則需要指定首碼是啥# 比如 當請求fabio地址http://fabio_ip:9999/urlprefix-/webService # fabio將會把請求轉寄到consul中tag為"urlprefix-/webService"的服務# 也就是說"urlprefix-"是fabio和consule服務註冊者在consul註冊服務打標籤時約定的標籤首碼registry.consul.tagprefix = urlprefix-
fabio還有很多關於反代的參數, 比如代理https時使用的認證, http頭的修改等等配置, 詳情參見官方文檔 https://fabiolb.net/ref/
自訂代理路由
fabio預設會按照proxy.matcher配置的匹配方法自動向consul轉寄請求, 當然也可以自訂路由進行轉寄
如何配置自訂轉寄路由規則?
登陸consul的UI介面, 在Key/Value中建立
Key:
fabio/config
Value:
route add serviceName1 /abc http://192.168.1.1/
如所示
新增自訂轉寄路由
轉寄的路由規則文法請參見官方文檔
https://fabiolb.net/cfg/
查看Fabio路由表
http://fabio_ip:9998/routes
Fabio路由表: 其中第1條是fabio自動轉寄的路由, 第2條是我們自訂的路由規則
路由有各種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向自己轉寄請求時自己應該告訴fabio些什麼:
urlprefix-/web2
: 當使用者請求fabio(你)的uri首碼是"/urlprefix-/web2"的時候才轉寄到consul(我)這個服務(注意urlprefix-/web2在tag裡時前面時沒有/的)
proto=https
:consul(我)的這個服務是https的
tlsskipverify=true
:fabio(你)在訪問consul(我)的這個服務時請跳過認證檢查
比如在fabio新增一個路由時:
route add web2 /web2 https://x.x.x.x:8080/ opts "proto=https, tlsskipverify=true"
這個自訂路由是fabio告訴自己, 當匹配到uri為/web2的請求時, 應該將請求轉寄的目標是什麼, 轉寄給目標時需要哪些參數:
proto=https
目標是https協議
tlsskipverify=true
轉寄給目標時, 忽略目標的ssl認證檢查