一.consul的介紹
1.1consul是什么?
Consul是HashiCorp公司推出的開源工具,用于實現分布式系統的服務發現與配置。 Consul是分布式的、高可用的、可橫向擴展的。它具備以下特性 :
service discovery:consul通過DNS或者HTTP接口使服務注冊和服務發現變的很容易,一些外部服務,例如saas提供的也可以一樣注冊。
health checking:健康檢測使consul可以快速的告警在集群中的操作。和服務發現的集成,可以防止服務轉發到故障的服務上面。
key/value storage:一個用來存儲動態配置的系統。提供簡單的HTTP接口,可以在任何地方操作。
multi-datacenter:無需復雜的配置,即可支持任意數量的區域。
2.2使用consul服務場景
因為一套微服務架構中有很多個服務需要管理,也就是說會有很多對grpc。如果一一對應的進行管理會很繁瑣所以我們需要有一個管理發現的機制。
二.部署集群
2.1部署環境
服務器 | 服務 | 操作系統 |
---|---|---|
192.168.106.90 | Docker-ce、Compose 3、Consul、Consul-template | centos7 |
192.168.106.91 | Docker-ce、registrator | centos7 |
2.2搭建Consul
##上傳解壓到指定文件夾中
[root@server1 ~]# mkdir /root/consul
[root@server1 ~]# cp consul_0.9.2_linux_amd64.zip /root/consul
[root@server1 ~]# cd /root/consul/
[root@server1 consul]# unzip consul_0.9.2_linux_amd64.zip
Archive: consul_0.9.2_linux_amd64.zipinflating: consul
[root@server1 consul]# ls
consul consul_0.9.2_linux_amd64.zip
[root@server1 consul]# mv consul /usr/bin/ #導入系統環境方便系統識別[root@server1 consul]# consul agent \ ##agent代理
-server \ ##提供server功能
-bootstrap \
-ui \ #提供web訪問界面
-data-dir=/var/lib/consul-data \##參數地址
-bind=192.168.106.90 \ ##監聽地址
-client=0.0.0.0 \ ##服務地址
-node=consul-server01 &> /var/log/consul.log &
##指定本地節點名稱 產生日志混合輸出到 后臺運行
[1] 129523[root@server1 consul]# consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.106.90:8301 alive server 0.9.2 2 dc1[root@server1 consul]# consul info | grep leaderleader = trueleader_addr = 192.168.106.90:8300[root@server1 consul]# jobs
[1]+ 運行中 consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.106.90 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
查看集群信息
[root@server1 ~]# consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.106.90:8301 alive server 0.9.2 2 dc1[root@server1 ~]# consul info | grep leaderleader = trueleader_addr = 192.168.106.90:8300
通過httpd api 獲取集群信息
[root@server1 ~]# curl 127.0.0.1:8500/v1/status/peers ##查看集群server成員
[root@server1 ~]# curl 127.0.0.1:8500/v1/status/leader ##集群Raf leader
[root@server1 ~]# curl 127.0.0.1:8500/v1/catalog/services ##注冊的所有服務
[root@server1 ~]# curl 127.0.0.1:8500/v1/catalog/nginx ##查看nginx服務信息
[root@server1 ~]# curl 127.0.0.1:8500/v1/catalog/nodes ##集群節點詳細信息
新啟一個服務器
安裝Gliderlabs/Registrator Gliderlabs/Registrator
可檢查容器運行狀態自動注冊,還可注銷docker容器的服務到服務配置中心。
在192.168.106.91節點,執行以下操作:
[root@server1 ~]# docker run -d \
--name=registrator \ ##名稱
--net=host \ ##指定網絡
-v /var/run/docker.sock:/tmp/docker.sock
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.106.91 \
consul://192.168.106.90:8500 ##consul服務器ip
測試服務發現功能是否正常
新建2個nginx服務容器
新建2個apache服務容器
[root@server1 ~]# docker run -itd -p 83:80 --name test-01 -h test01 nginx
[root@server1 ~]# docker run -itd -p 84:80 --name test-02 -h test02 nginx
[root@server1 ~]# docker run -itd -p 88:80 --name test-03 -h test03 httpd
[root@server1 ~]# docker run -itd -p 89:80 --name test-04 -h test04 httpd
網頁驗證http和nginx服務是否注冊到 consul
瀏覽器輸入 http://192.168.106.90:8500, “單擊 NODES”,然后單擊“consurl-server01
2.3驗證
在容器中關閉一臺nginx服務容器,網頁查看狀態
[root@server1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2cc76ac54834 httpd "httpd-foreground" 5 hours ago Up 5 hours 0.0.0.0:88->80/tcp test-03
95b5dc7ab301 httpd "httpd-foreground" 5 hours ago Up 5 hours 0.0.0.0:89->80/tcp test-04
7cb476ca85f5 gliderlabs/registrator:latest "/bin/registrator -i…" 5 hours ago Up 5 hours registrator
db10b647c5e6 nginx "/docker-entrypoint.…" 5 hours ago Up 5 hours 0.0.0.0:84->80/tcp test-02
8f03002bbcda nginx "/docker-entrypoint.…" 5 hours ago Up 5 hours 0.0.0.0:83->80/tcp test-01
[root@server1 ~]# docker stop db10b647c5e6
db10b647c5e6
網頁顯示少一臺nginx容器
三.consul-template
Consul-template 是一個守護進程,用于實時查詢consul集群信息,并更新文件系統上任意數量的指定模板,生成配置文件。更新完成以后,可以選擇運行shell命令執行更新操作,重新加載Nginx。Consul-Template可以查詢Consul中的服務目錄、Key、Key-values等。
這種強大的抽象功能和查詢語言模板可以是Consul-Template 特別適合動態的創建配置文件。
例如:創建 Apache/Nginx Proxy Balancers、Haproxy Backends
3.1配置nginx模板文件
[root@server1 consul]# cd
[root@server1 ~]# cd /root/consul/
[root@server1 consul]# vim nginx.ctmplupstream http_backend { ##基于四層轉發{{range service "nginx"}} ##遍歷nginx服務server{{.Address}}:{{.Port}}; ##地址 端口{{end}} ##結束符
}
server {listen 83;server_name localhost 192.168.106.90;access_log /var/log/nginx/tat-access.log;index inde.html index.php;location / {proxy_set_header HOST $host; proxy_set_header X-Real-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;##調用地址池}
}
3.2編譯安裝nginx
[root@server1 consul]# yum -y install gcc- gcc-c++ pcre-devel zlib-devel ##依賴環境
##上傳文件 解壓到opt目錄下
[root@server1 ~]# tar zxvf nginx-1.6.0.tar.gz -C /opt/
##安裝
[root@server1 ~]# cd /opt/nginx-1.6.0/
[root@server1 nginx-1.6.0]# ./configure --prefix=/usr/local/nginx
[root@server1 nginx-1.6.0]# make && make install
##更改配置文件
[root@server1 nginx-1.6.0]# vim /usr/local/nginx/conf/nginx.conf
http {include mime.types;include vhost/*.conf; ##添加這一行,子配置文件default_type application/octet-stream;
[root@server1 nginx-1.6.0]# cd /usr/local/nginx/conf/
[root@server1 conf]# mkdir vhost ##新建虛擬主機文件
[root@server1 conf]# mkdir /var/log/nginx ##新建日志文件目錄
[root@server1 conf]# cd vhost
3.3配置并啟動 template
##上傳consul-template_0.19.3_linux_amd64.zip到/root 解壓到/usr/bin/供系統識別
[root@server1 vhost]# cd
[root@server1 ~]# unzip consul-template_0.19.3_linux_amd64.zip
[root@server1 ~]# mv consul-template /usr/bin/
[root@server1 ~]# consul-template -consul-addr 192.168.106.90:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/tat.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info ##指定地址 指定template到子配置文件vhost虛擬主機中 重載
驗證:停止和重新開啟一個容器
測試服務發現及配置更新功能
##節點端
[root@server1 ~]# docker start 40cd85d93795
40cd85d93795
[root@server1 ~]# docker stop 40cd85d93795
40cd85d93795
##consul服務端
2020/12/01 10:43:47.919942 [INFO] (runner) initiating run
2020/12/01 10:43:47.920786 [INFO] (runner) rendered "/root/consul/nginx.ctmpl" => "/usr/local/nginx/conf/vhost/tat.conf"
2020/12/01 10:43:47.920808 [INFO] (runner) executing command "/usr/local/nginx/sbin/nginx -s reload" from "/root/consul/nginx.ctmpl" => "/usr/local/nginx/conf/vhost/tat.conf"
2020/12/01 10:43:47.920846 [INFO] (child) spawning: /usr/local/nginx/sbin/nginx -s reload
2020/12/01 10:43:58.353307 [INFO] (runner) initiating run
2020/12/01 10:43:58.354554 [INFO] (runner) rendered "/root/consul/nginx.ctmpl" => "/usr/local/nginx/conf/vhost/tat.conf"
2020/12/01 10:43:58.354588 [INFO] (runner) executing command "/usr/local/nginx/sbin/nginx -s reload" from "/root/consul/nginx.ctmpl" => "/usr/local/nginx/conf/vhost/tat.conf"
2020/12/01 10:43:58.354639 [INFO] (child) spawning: /usr/local/nginx/sbin/nginx -s reload
查看虛擬vhost配置
[root@server1 vhost]# cat /usr/local/nginx/conf/vhost/tat.conf
upstream http_backend {server 192.168.106.91:83;server 192.168.106.91:84;}
server {listen 83;server_name localhost 192.168.106.90;access_log /var/log/nginx/tat-access.log;index inde.html index.php;location / {proxy_set_header HOST $host;proxy_set_header X-Real-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@server1 ~]# docker logs -f test-01
[root@server1 ~]# docker logs -f test-02
[root@server1 ~]# docker logs -f test-05
四.consul多節點
提前安裝好docker
在192.168.106.90 把consul文件傳到192.168.106.100的/usr/local/bin
[root@server1 bin]# scp /usr/bin/consul root@192.168.106.100:/usr/local/bin/
配置多節點
[root@server1 ~]# consul agent -server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.106.100 \
-client=0.0.0.0 \
-node=consul-server02 \ 節點名稱##
-enable-script-checks=true \ ##設置檢查服務為可用
-datacenter=dc1 \ ##數據中心名稱
-join 192.168.106.90 &> /var/log/consul.log & ##加入到已有的集群中
查看集群節點狀態
[root@server1 ~]# curl 127.0.0.1:8500/v1/catalog/nodes
[{"ID":"ea5109c6-e3c9-b310-5fd5-500f5ee08347","Node":"consul-server01","Address":"192.168.106.90","Datacenter":"dc1","TaggedAddresses":null,"Meta":null,"CreateIndex":6,"ModifyIndex":6},{"ID":"d24113ce-f452-93cf-ef9d-1b79b46c4553","Node":"consul-server02","Address":"192.168.106.100","Datacenter":"dc1","TaggedAddresses":{"lan":"192.168.106.100","wan":"192.168.106.100"},"Meta":{},"CreateIndex":5,"ModifyIndex":7}]
edAddresses":null,“Meta”:null,“CreateIndex”:6,“ModifyIndex”:6},{“ID”:“d24113ce-f452-93cf-ef9d-1b79b46c4553”,“Node”:“consul-server02”,“Address”:“192.168.106.100”,“Datacenter”:“dc1”,“TaggedAddresses”:{“lan”:“192.168.106.100”,“wan”:“192.168.106.100”},“Meta”:{},“CreateIndex”:5,“ModifyIndex”:7}]
---------------------
作者:Rikkatang
來源:CSDN
原文:https://blog.csdn.net/rikkatang/article/details/110449434
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件