雲原生Docker篇-----docker consul的容器服務更新與發現
theme: vue-pro
一 Docker consul 的容器服務更新與發現
什麼是服務註冊與發現 服務註冊與發現是微服務架構中不可或缺的重要元件。起初服務都是單節點的,不保障高可用性,也不考慮服務的壓力承載,服務之間呼叫單純的通過介面訪問。直到後來出現了多個節點的分散式架構,起初的解決手段是在服務前端負載均衡,這樣前端必須要知道所有後端服務的網路位置,並配置在配置檔案中。這裡就會有幾個問題: - 如果需要呼叫後端服務A-N,就需要配置N個服務的網路位置,配置很麻煩 - 後端服務的網路位置變化,都需要改變每個呼叫者的配置
既然有這些問題,那麼服務註冊與發現就是解決這些問題的。後端服務A–N可以把當前自己的網路位置註冊到服務發現模組,服務發現就以K-v的方式記錄下來,K–般是服務名,v就是IP:PORT。服務發現模組定時的進行健康檢查,輪詢檢視這些後端服務能不能訪問的了。前端在呼叫後端服務A-N的時候,就跑去服務發現模組問下它們的網路位置,然後再呼叫它們的服務。這樣的方式就可以解決上面的問題了,前端完全不需要記錄這些後端服務的網路位置,前端和後端完全解耦
1.1 什麼是consul?
- consul是google開源的一個使用go語言開發的服務管理軟體。支援多資料中心、分散式高可用的、服務發現和配置共享。採用Raft演算法,用來保證服務的高可用。內建了服務註冊與發現框架、分佈一致性協議實現、健康檢查、Key/Value儲存、多資料中心方案,不再需要依賴其他工具(比如ZooKeeper等)。
- 服務部署簡單,只有一個可執行的二進位制的包。每個節點都需要執行agent,他有兩種執行模式server和client。
- 每個資料中心官方建議需要3或5個server節點以保證資料安全,同時保證server-leader的選舉能夠正確的進行。
- 在client模式下,所有註冊到當前節點的服務會被轉發到server節點,本身是不持久化這些資訊。
- 在server模式下,功能和client模式相似,唯一不同的是,它會把所有的資訊持久化到本地,這樣遇到故障,資訊是可以被保留的。
- server-leader是所有server節點的老大,它和其它server節點不同的是,它需要負責同步註冊的資訊給其它的server節點,同時也要負責各個節點的健康監測。
1.2 consul提供的一些關鍵特性
服務註冊與發現
consul通過DNS或者HTTP介面使服務註冊和服務發現變的很容易,一些外部服務,例如saas提供的也可以一樣註冊。
健康檢查
健康檢測使consul可以快速的告警在叢集中的操作。和服務發現的整合,可以防止服務轉發到故障的服務上面。
Key/Value儲存
一個用來儲存動態配置的系統。提供簡單的HTTP介面,可以在任何地方操作。
多資料中心
無需複雜的配置,即可支援任意數量的區域。
安裝consul是用於服務註冊,也就是容器本身的一些資訊註冊到consul裡而,其他程式可以通過consul獲取註冊的相關服務資訊,這就是服務註冊與發現。
二 Consul部署
2.1 環境準備
所有伺服器關閉防火牆和SElinux
| 伺服器型別 | 系統 |IP地址|需要安裝的元件 | --- | --- |---|---| |consul伺服器 |CentOS7.4(64 位) |192.168.85.80|執行consul服務、nginx服務、consul-template守護程序 registrator伺服器|CentOS7.4(64 位)|192.168.85.90 |執行registrator容器、nginx服務
2.2 consul伺服器
1. 建立 Consul 服務
2. 設定代理,在後臺啟動 consul 服務端
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.85.80 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
相關選項說明如下:
| 選項 | 含義 | | --- | --- | | -以server身份啟動 | 預設是client。 | -bootstrap |用來控制一個server是否在bootstrap模式,在一個數據中心中只能有一個server處於bootstrap模式,當一個server處於 bootstrap模式時,可以自己選舉為 server-leader。 -bootstrap-expect=2|叢集要求的最少server數量,當低於這個數量,叢集即失效。 -ui |指定開啟 UI 介面,這樣可以通過 http://localhost:8500/ui 這樣的地址訪問 consul 自帶的 web UI 介面。 -data-dir |指定資料儲存目錄。 -bind |指定用來在叢集內部的通訊地址,叢集內的所有節點到此地址都必須是可達的,預設是0.0.0.0。 -client |指定 consul 繫結在哪個 client 地址上,這個地址提供 HTTP、DNS、RPC 等服務,預設是 127.0.0.1。 -node |節點在叢集中的名稱,在一個叢集中必須是唯一的,預設是該節點的主機名。 -datacenter |指定資料中心名稱,預設是dc1。
5個埠的解釋
- 8300:replication、leader farwarding的埠
- 8301:lan cossip的埠
- 8302:wan gossip的埠
- 8500:web ui介面的埠
- 8600:使用dns協議檢視節點資訊的埠
2. 檢視叢集資訊
1)檢視member狀態
2)檢視叢集狀態
``` consul operator raft list-peers
consul info | grep leader
```
3. 通過 http api 獲取叢集資訊
curl 192.168.85.80:8500/v1/status/peers #檢視叢集server成員
curl 192.168.85.80:8500/v1/status/leader #叢集 server-leader
curl 192.168.85.80:8500/v1/catalog/services #註冊的所有服務
curl 192.168.85.80:8500/v1/catalog/nginx #檢視 nginx 服務資訊
curl 192.168.85.80:8500/v1/catalog/nodes #叢集節點詳細資訊
2.3 registrator伺服器
2.3.1 容器服務自動加入 Nginx 叢集
1. 安裝 Gliderlabs/Registrator
- Gliderlabs/Registrator可檢查容器執行狀態自動註冊,還可登出docker容器的服務到服務配置中心。
- 目前支援Consul、Etcd和SkyDNS2。
| 命令 | 含義 | | --- | --- | --net=host |把執行的docker容器設定為host網路模式。 -v /var/run/docker.sock:/tmp/docker.sock |把宿主機的Docker守護程序(Docker daemon)預設監聽的Unix域套接字掛載到容器中。 --restart=always |設定在容器退出時總是重啟容器。 --ip |剛才把network指定了host模式,所以我們指定ip為宿主機的ip。 consul |指定consul伺服器的IP和埠。
2.安裝Nginx、httpd測試映象
``` docker run -id -p81:80 --name test-01 -h test01 nginx docker run -id -p82:80 --name test-02 -h test02 nginx docker run -id -p83:80 --name test-03 -h test03 httpd docker run -id -p84:80 --name test-04 -h test04 httpd
-h:設定容器主機名
```
3. 在consul伺服器中檢視映象是否註冊
4. 驗證 http 和 nginx 服務是否註冊到 consul
2.4 配置template模板自動更新
-
Consul-Template是基於Consul的自動替換配置檔案的應用。Consul -Template是一個守護程序, 用於實時查詢Consul叢集資訊,並更新檔案系統上任意數量的指定模板,生成配置檔案。更新完成以後,可以選擇執行shell 命令執行更新操作,重新載入Nginx。
-
Consul-Template可以查詢Consul中的服務目錄、Key、Key-values 等。這種強大的抽象功能和查詢語言模板可以使Consul -Template特別適合動態的建立配置檔案。例如:建立Apache/Nginx Proxy BalancersHaproxy Backends等。
2.4.1 準備 template nginx 模板檔案
1)在consul伺服器上操作
2) 傳入Nginx的安裝包並解壓
3) 建立Nginx程式使用者並安裝依賴環境
4)編譯安裝後優化路徑
5) 修改Nginx配置檔案
6)建立Nginx的vhost和日誌目錄
7) 傳入consul-template_0.19.3_linux_amd64.zip壓縮包並解壓
8)前臺啟動consul-template
啟動後不要按 ctrl+c 中止 consul-template 程序
consul-template --consul-addr 192.168.85.80:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/bba.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
9)另外開啟一個終端檢視生成配置檔案
cd /usr/local/nginx/conf/vhost
10)在registrator伺服器上新增埠為85的nginx容器
11)檢視consul伺服器執行template服務頁面發生了變化
12)修改容器nginx站點目錄中預設的html.index檔案
13) 瀏覽器訪問
2.5 consul 多節點配置
1)先建立 consul 服務
2)新增一臺已有docker環境的伺服器加入到已有的叢集中
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.85.70\
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 192.168.85.80 &> /var/log/consul.log &
| 命令 | 含義 |
| --- | --- |
-enable-script-checks=true |設定檢查服務為可用
-datacenter :|資料中心名稱
-join |加入到已有的叢集中
總結
所有以.sock結尾的檔案都是應用的資料連線檔案
啟動consul後預設會監聽的5個埠
- 8300:叢集內部資料的讀寫和複製
- 8301:單個數據中心gossip協議通訊
- 8302:誇資料中心gossip協議通訊
- 8500:提供獲取服務列表,註冊服務,登出服務等HTTP介面:提供UI服務
- 8600:採用DNS協議提供服務發現功能
解決什麼問題?
- 如果後端有大規模的服務節點叢集是配置麻煩的問題
- 每次後端服務網路位置變化都需要人工修改前端排程器配置的問題
服務的自動發現和註冊 consul
registrator 發現應用的網站位置,併發送給 consul server 的自動發現模組進行註冊
consul agent (server/client)
- consul_client 收集自動發現的資訊,將所有需要註冊的資訊轉發到server節點,不持久化這些資訊
- consul_server 持久化所有資訊到本地,通過server-leader將資訊同步給其他的server節點,以及各個節點的健康測試
consul-template 基於consul的註冊的資訊自動替換配置檔案