天天看點

Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

目錄

一.Docker consul

1.什麼是服務注冊與發現

2.什麼是consul

二.consul 部署

1.環境準備

2.部署consul伺服器

(1) 部署 Consul 伺服器

(2)registrator伺服器

三.consul-template

1.Consul-Template簡介

2.安裝準備 template nginx

(1)準備 template nginx 模闆檔案

(2)編譯安裝nginx

(3)配置 nginx

(4)配置并啟動 template

(5)通路 template-nginx

(6)增加一個 nginx 容器節點

3.consul 多節點

一.Docker consul

1.什麼是服務注冊與發現

        服務注冊與發現是微服務架構中不可或缺的重要元件。起初服務都是單節點的,不保障高可用性,也不考慮服務的壓力承載,服務之間調用單純的通過接口通路。直到後來出現了多個節點的分布式架構,起初的解決手段是在服務前端負載均衡,這樣前端必須要知道所有後端服務的網絡位置,并配置在配置檔案中。這裡就會有幾個問題:

●如果需要調用後端服務A-N,就需要配置N個服務的網絡位置,配置很麻煩

●後端服務的網絡位置變化,都需要改變每個調用者的配置

        既然有這些問題,那麼服務注冊與發現就是解決這些問題的。後端服務A-N可以把目前自己的網絡位置注冊到服務發現子產品,服務發現就以K-V的方式記錄下來,K一般是服務名,V就是IP:PORT。服務發現子產品定時的進行健康檢查,輪詢檢視這些後端服務能不能通路的了。前端在調用後端服務A-N的時候,就跑去服務發現子產品問下它們的網絡位置,然後再調用它們的服務。這樣的方式就可以解決上面的問題了,前端完全不需要記錄這些後端服務的網絡位置,前端和後端完全解耦!

2.什麼是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節點,同時也要負責各個節點的健康監測。

consul提供的一些關鍵特性:

服務注冊與發現:

        consul通過DNS或者HTTP接口使服務注冊和服務發現變的很容易,一些外部服務,例如saas提供的也可以一樣注冊。

健康檢查:

        健康檢測使consul可以快速的告警在叢集中的操作。和服務發現的內建,可以防止服務轉發到故障的服務上面。

Key/Value存儲:

        一個用來存儲動态配置的系統。提供簡單的HTTP接口,可以在任何地方操作。

多資料中心:無需複雜的配置,即可支援任意數量的區域。

        安裝consul是用于服務注冊,也就是容器本身的一些資訊注冊到consul裡面,其他程式可以通過consul擷取注冊的相關服務資訊,這就是服務注冊與發現。

二.consul 部署

1.環境準備

consul伺服器     192.168.80.15 運作consul服務、nginx服務、consul-template守護程序
registrator伺服器 192.168.80.10 運作registrator容器、運作nginx容器

關閉防火牆

systemctl stop firewalld.service
setenforce 0
           

2.部署consul伺服器

(1) 部署 Consul 伺服器

mkdir /opt/consul
cp consul_0.9.2_linux_amd64.zip /opt/consul
cd /opt/consul
unzip consul_0.9.2_linux_amd64.zi
mv consul /usr/local/bin/
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

設定代理,在背景啟動 consul 服務端

consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.111.171 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template
-server: 以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。
           

檢視consul啟動情況

netstat -natp | grep consul
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template
啟動consul後預設會監聽5個端口:
8300:replication、leader farwarding的端口
8301:lan cossip的端口
8302:wan gossip的端口
8500:web ui界面的端口
8600:使用dns協定檢視節點資訊的端口
           

(2)registrator伺服器

容器服務自動加入 Nginx 叢集

安裝 Gliderlabs/Registrator

Gliderlabs/Registrator 可檢查容器運作狀态自動注冊,還可登出 docker 容器的服務到服務配置中心。目前支援 Consul、Etcd 和 SkyDNS2。

docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.111.173 \
consul://192.168.111.171:8500
           
--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和端口。
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

測試服務發現功能是否正常

docker run -itd -p:83:80 --name test-01 -h test01 nginx
docker run -itd -p:84:80 --name test-02 -h test02 nginx
docker run -itd -p:88:80 --name test-03 -h test03 httpd
docker run -itd -p:89:80 --name test-04 -h test04 httpd				#-h:設定容器主機名
           

驗證 http 和 nginx 服務是否注冊到 consul

浏覽器中,輸入 http://192.168.111.171:8500,在 Web 頁面中“單擊 NODES”,然後單擊“consurl-server01”,會出現 5 個服務。
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

在consul伺服器使用curl測試連接配接伺服器

curl 127.0.0.1:8500/v1/catalog/services 
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

三.consul-template

1.Consul-Template簡介

        Consul-Template是基于Consul的自動替換配置檔案的應用。Consul-Template是一個守護程序,用于實時查詢Consul叢集資訊,并更新檔案系統上任意數量的指定模闆,生成配置檔案。更新完成以後,可以選擇運作 shell 指令執行更新操作,重新加載 Nginx。

        Consul-Template可以查詢Consul中的服務目錄、Key、Key-values 等。這種強大的抽象功能和查詢語言模闆可以使 Consul-Template 特别适合動态的建立配置檔案。例如:建立Apache/Nginx Proxy Balancers 、 Haproxy Backends等。

2.安裝準備 template nginx

(1)準備 template nginx 模闆檔案

在consul伺服器上操作

vim /opt/consul/nginx.ctmpl
#定義nginx upstream一個簡單模闆
upstream http_backend {
  {{range service "nginx"}}
   server {{.Address}}:{{.Port}};
   {{end}}
}

#定義一個server,監聽8000端口,反向代理到upstream
server {
    listen 8000;
    server_name localhost 192.168.80.15;
    access_log /var/log/nginx/kgc.com-access.log;							#修改日志路徑
    index index.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;
    }
}
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

(2)編譯安裝nginx

yum -y install pcre-devel zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd /opt/nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
           

(3)配置 nginx

vim /usr/local/nginx/conf/nginx.conf
......
http {
     include       mime.types;
     include  vhost/*.conf;       				#添加虛拟主機目錄
     default_type  application/octet-stream;
......
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

建立虛拟主機目錄

mkdir /usr/local/nginx/conf/vhost
           

建立日志檔案目錄

mkdir /var/log/nginx
           

啟動nginx

nginx
           

(4)配置并啟動 template

unzip consul-template_0.19.3_linux_amd64.zip -d /opt/
cd /opt/
mv consul-template /usr/local/bin/
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

在前台啟動 template 服務,啟動後不要按 ctrl+c 中止 consul-template 程序。

consul-template --consul-addr 192.168.111.171:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

另外打開一個終端檢視生成配置檔案

Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

(5)通路 template-nginx

檢視正在運作的容器

Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template
docker exec -it 6f3949f94d27 bash
echo "this is xcc2 web" > /usr/share/nginx/html/index.html

docker exec -it 85795980469e bash
echo "this is xcc1 web" > /usr/share/nginx/html/index.html
           
浏覽器通路:http://192.168.111.171:8000/ ,并不斷重新整理。
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

(6)增加一個 nginx 容器節點

增加一個 nginx 容器節點,測試服務發現及配置更新功能。

docker run -itd -p:85:80 --name ceshi -h ceshi nginx
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

如果顯示如下報錯資訊,說明需要把防火牆打開

[[email protected] ~]# docker run -itd -p:87:80 --name ceshi11 -h ceshi11 nginx
WARNING: IPv4 forwarding is disabled. Networking will not work.
ebdade80d985e96947067719b4533da63df16c6751fb3ce78829fb2240260c74
docker: Error response from daemon: driver failed programming external connectivity on endpoint ceshi11 (4d52a43f78fbef782803c61cbea34e4e3c9dd8a45a6605c42a3f9fb195aece81):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 87 -j DNAT --to-destination 172.17.0.6:80 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

觀察 template 服務,會從模闆更新/usr/local/nginx/conf/vhost/kgc.conf 檔案内容,并且重載 nginx 服務。

Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

檢視/usr/local/nginx/conf/vhost/kgc.conf 檔案内容

Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

檢視三台 nginx 容器日志,請求正常輪詢到各個容器節點上

docker logs -f test-01
docker logs -f test-02
docker logs -f ceshi111
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

3.consul 多節點

添加一台已有docker環境的伺服器192.168.111.175/24加入已有的群集中

注意:新的伺服器也要安裝consul

consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.111.175 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true  \
-datacenter=dc1  \
-join 192.168.111.171 &> /var/log/consul.log &
           
-enable-script-checks=true :設定檢查服務為可用
-datacenter : 資料中心名稱
-join :加入到已有的叢集中
           
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template
Docker consul的容器服務更新與發現一.Docker consul二.consul 部署三.consul-template

繼續閱讀