文章目錄
什麼是consul?
Consul是HashiCorp公司推出的開源工具,用於實現分佈式系統的服務發現與配置。
它主要由多個組成部分:
- 服務發現:客戶端通過Consul提供服務,類似於API,MySQL,或者其他客戶端可以使用Consul發現服務的提供者。使用類似DNS或者HTTP,應用程序和可以很輕鬆的發現他們依賴的服務。
- 檢查健康:Consul客戶端可以提供與給定服務相關的健康檢查(Web服務器返回200 ok)或者本地節點(“內存利用率低於90%”)。這些信息可以監控集羣的運行情況,並且使訪問遠離不健康的主機組件。
- 鍵值對存儲:應用程序可以使用Cousul的層級鍵值對。
- 多數據中心:Consul有開箱及用的多數據中心。
Consul的特性
- Consul支持健康檢查,允許存儲鍵值對
- 一致性協議採用Raft算法,用來保證服務的高可用
- 成員管理和消息廣場採用GOSSIP協議,支持ACL訪問控制
方便部署,與Docker等輕量級容器可無縫配合
軟件包:
百度網盤鏈接:https://pan.baidu.com/s/1pYu12vUpSnwyNpgPzjduEQ
提取碼:v14g
一、構建自動發現的Docker服務架構
- 每個提供服務的節點上都要部署和運行Consul的agent
- Consul agent有兩種運行模式:
- Server
- Client
- Server和Client只是Consul集羣層面的區分,與搭建在Cluster之上的應用服務無關
節點 | IP | 部署服務 |
---|---|---|
consul服務器 | 192.168.11.141 | docker-ce、consul、consul-template、nginx(反向代理) |
node後端節點 | 192.168.11.133 | docker-ce、registrator |
1、建立Consul服務
#創建工作目錄
[root@localhost ~]#mkdir consul
#上傳軟件包並解壓
[root@localhost ~]# cd consul
[root@localhost consul]# unzip consul_0.9.2_linux_amd64.zip
[root@localhost consul]# mv consul /usr/bin/
#安裝代理端
[root@localhost consul]# consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.11.141 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
#查看集羣信息
#查看集羣節點詳細信息
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/nodes
#通過httpd api獲取集羣信息
curl 127.0.0.1:8500/v1/status/peers #查看集羣server成員
curl 127.0.0.1:8500/v1/status/leader #集羣Raf leader
curl 127.0.0.1:8500/v1/catalog/services #註冊的所有服務
curl 127.0.0.1:8500/v1/catalog/nginx #查看nginx服務信息
curl 127.0.0.1:8500/v1/catalog/nodes #集羣節點詳細信息
#關閉防火牆便於其他節點訪問
[root@localhost consul]# systemctl stop firewalld.service
[root@localhost consul]# setenforce 0
2、容器服務自動加入consul集羣
在後端node節點操作
#安裝Gliderlabs/Registrator
檢查容器運行狀態
自動註冊和註銷docker容器的服務到服務配置中心
目前支持Consul、Etcd和SkyDNS2.
[root@localhost ~]# docker run -d \
--name=registrator \ #下載容器
--net=host \ #網絡host模式
-v /var/run/docker.sock:/tmp/docker.sock \ #數據卷掛載sock通訊文件
--restart=always \ #重啓策略
gliderlabs/registrator:latest \ #鏡像名稱
-ip=192.168.11.133 \ #本機IP地址
consul://192.168.11.141:8500 #指向consul IP地址
3、測試服務發現功能
#測試服務發現功能是否正常
多創建幾個容器測試
[root@localhost ~]# docker run -itd -p:81:80 --name test-01 -h test01 nginx
[root@localhost ~]# docker run -itd -p:82:80 --name test-02 -h test02 nginx
[root@localhost ~]# docker run -itd -p:83:80 --name test-03 -h test03 httpd
[root@localhost ~]# docker run -itd -p:84:80 --name test-04 -h test04 httpd
#在consul服務器上查看服務
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/services
{"consul":[],"httpd":[],"nginx":[]}
#驗證httpd以及nginx服務是否註冊到consul
在瀏覽器中打開consul:http://192.168.11.141:8500,“單擊NODES”,然後點擊“consul-server01”,會出現5個服務
#現在我們來看下logs日誌
[root@localhost ~]# docker logs -f test-01
二、部署consul-template更新,實現容器服務自動加入Nginx集羣
consul-template
consul-template是一個守護進程,用於實時查詢consul集羣信息,並更新文件系統上任意數量的指定模板,生成配置文件。更新完成以後,可以選擇運行shell命令執行更新操作,重新加載nginx
-
基於Consul的自動替換配置文件的應用
-
可以查詢Consul中的服務目錄、Key、Key-values等
-
特別適合動態的創建配置文件
1、安裝consul-template
#準備template nginx模板文件
[root@localhost ~]# vim /root/consul/nginx.ctmpl
upstream http_backend {
#指定nginx的服務
{{range service "nginx"}}
#指向真實服務器的IP地址以及對應的端口 這裏面引用的變量會通過consul裏面的參數羣集自動設置上去
server {{.Address}}:{{.Port}};
{{end}}
}
server {
#對外端口(自定義,不能衝突)
listen 88;
#本地反向代理節點地址
server_name localhost 192.168.11.141;
#指定日誌文件的路徑(需要創建)
access_log /var/log/nginx/web.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Pral-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
#創建日誌文件目錄
[root@localhost ~]#mkdir /var/log/nginx
2、編譯安裝nginx
#安裝環境包
[root@localhost consul]# yum install -y gcc gcc-c++ pcre-devel zlib-devel
#上傳nginx包並解壓至opt目錄
[root@localhost consul]# tar zxvf nginx-1.12.2.tar.gz -C /opt/
#編譯安裝
[root@localhost consul]# cd /opt/nginx-1.12.2
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
[root@localhost nginx-1.12.2]# make && make install
#配置nginx
[root@localhost nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
#創建虛擬主機目錄
[root@localhost nginx-1.12.2]# mkdir /usr/local/nginx/conf/vhost
#優化並啓動nginx服務
[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/bin/
[root@localhost nginx-1.12.2]# nginx
3、配置並啓動template
#上傳consul-template包並解壓
[root@localhost ~]# cd /root/consul
[root@localhost consul]# unzip consul-template_0.19.3_linux_amd64.zip
#將consul-template移至/usr/bin目錄下使系統識別命令
[root@localhost consul]# mv consul-template /usr/bin/
#啓動consul-template
[root@localhost consul]# consul-template -consul-addr 192.168.11.141:8500 \
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/web.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
解釋:
#指向consul服務端節點IP
consul-template -consul-addr 192.168.11.141:8500 \
#指定模板路徑:生成文件指定到vhost文件下命名web.conf:當文件生成完成後配置文件更改,使用nginx -s reload不中斷重載服務(模板重新生成之後就會重新加載並生效)
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/web.conf:/usr/local/nginx/sbin/nginx -s reload"
#日誌級別爲info
–log-level=info
#另外打開終端查看生成的配置文件
[root@localhost ~]# cd /usr/local/nginx/conf/vhost
[root@localhost vhost]# ll
總用量 4
-rw-r--r-- 1 root root 480 4月 25 17:32 web.conf
[root@localhost vhost]# cat web.conf
自動生成了配置文件,且從consul中獲取後端節點IP 端口
當訪問192.168.11.141的88端口,它會轉發給192.168.11.133的81端口,實現反向代理
再訪問192.168.11.141的88端口,它會轉發給192.168.11.133的82端口,實現反向代理
訪問驗證
#未訪問前的日誌信息
#瀏覽器訪問192.168.11.141:88
#再次查看日誌文件(分別打開test-01、test-02的日誌)
4、增加nginx容器節點
node後端添加容器節點
#目前有兩個nginx容器
#再次添加nginx容器
[root@localhost ~]# docker run -itd -p:85:80 --name test-05 -test05 nginx
#我們到consul服務器看一下
#先看下監聽後端容器變化的監控
#在看下vhost裏面的web.conf配置文件
#node後端Registraror服務器上添加容器的節點nginx還沒有被訪問,所以還沒有日誌記錄
#現在進行訪問驗證,新創建的容器是否會產生日誌
打開瀏覽器再次訪問192.168.11.141:88(多刷新幾次)
訪問成功且後端容器節點logs日誌顯示輪詢則說明服務自動發現及更新配置完畢
總結
① congsul依靠這registrator自動發現容器的變化
② 容器一旦產生變化,就會使用template 加載模板,然後從consul中拉取參數,生成一個新的配置文件並進行重載,這時的配置文件就是在動態的變化