Consul服務註冊發現與Fabio反向 Proxy

來源:互聯網
上載者:User

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認證檢查
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.