Docker——consul容器服務更新與發現

什麼是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中拉取參數,生成一個新的配置文件並進行重載,這時的配置文件就是在動態的變化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章