Docker+Consul+Registrator實現服務自動註冊與發現

近年微服務架構在互聯網應用領域中愈來愈火,引入微服務主要解決了單體應用多個模塊的緊耦合、無法擴展和運維困難等問題。微服務架構就是按照功能粒度將業務模塊進行垂直拆分,對單體應用本身進行服務化和組件化,每個組件單獨部署爲小應用(從DB到UI)。微服務與微服務之間通過Service API進行交互,同時爲了支持水平擴展、性能提升和服務可用性,單個服務允許同時部署一個或者多個服務實例。在運行時,每個實例通常是一個雲虛擬機或者Docker容器。本篇文章就可以完美的解決這一問題!

關於docker這裏就不多介紹了,畢竟已經火遍大街小巷了,主要了解一下Consul、Registrator、Consul-tpmplate。

consul:是一個服務網格解決方案,它是一個一個分佈式的、高可用的系統,而且開發使用都很簡單、方便、它主要提供了一個功能齊全的控制平臺,主要特點:服務發現、健康檢查、鍵值存儲、安全服務通信、多數據中心;

Registrator:負責收集docker host上容器的信息,併發送給consul;

Consul-tpmplate:根據編輯好的模板生成新的nginx配置文件,並負責重新加載nginx配置文件;

博文大綱:
一、環境準備
二、docker01部署consul服務
三、docker02及docker03主機上以容器的方式運行consul服務
四、docker02及docker03主機上以容器的方式運行registrator服務
五、docker01部署Nginx服務,提供反向代理
六、在docker01安裝consul-template命令工具,並編寫模板
七、驗證服務的實時發現功能

一、環境準備

Docker+Consul+Registrator實現服務自動註冊與發現

組件之間的工作流程圖:
Docker+Consul+Registrator實現服務自動註冊與發現

二、docker01部署consul服務

docker01主機採用二進制的方式進行安裝!方法如下:

[root@docker01 ~]# wget https://releases.hashicorp.com/consul/1.6.2/consul_1.6.2_linux_amd64.zip
[root@docker01 ~]# unzip consul_1.6.2_linux_amd64.zip 
[root@docker01 ~]# mv consul /usr/local/bin/
[root@docker01 ~]# chmod +x /usr/local/bin/consul 
//下載這個軟件包獲取consul這個命令
[root@docker01 ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consule-data -bind=192.168.1.1  -client=0.0.0.0 -node=master &
[1] 2618
[root@docker01 ~]# nohup: 忽略輸入並把輸出追加到"nohup.out"

[root@docker01 ~]# 
//執行完命令後,需按兩次回車鍵,根據提示信息可以看出將命令輸出的信息保存到了一個名爲nohup.out的文件(當前目錄下)中。
//執行上述命令後,consul服務就放到後臺運行了,並返回其PID號,可以通過“jobs -l”命令進行查看

上述命令的相關參數解釋:

* -server:添加一個服務;
* -bootstrap:加入這個選項時,一般都在server單節點的時候使用,自選舉爲leader(領導);
* -ui:開啓內部的web頁面;
* -data-dir:(key/volume)數據存放目錄;
* -bind:指定開啓服務的IP;       
* -client:指定可以訪問的客戶端(指定加入的從節點);
* -node:指定集羣內通信使用的名稱(如果不指定,默認以主機名命名);

consul開啓的相應端口:

* 8300:集羣節點;
* 8301:集羣內部訪問的端口;
* 8302:跨數據中心之間的通信;
* 8500:提供web ui界面;
* 8600:使用DNS協議查看節點信息;
//因爲放到後臺了,所以這些端口信息都看不到,如果不放到後臺的話會佔用前臺終端,使前臺終端無法正常工作!

附加兩條查詢命令:

[root@docker01 ~]# consul info          //查看consul的詳細信息
……………………
    leader_addr = 192.168.1.1:8300        //主要就是查看consul集羣主節點是誰
…………………………
[root@docker01 ~]# consul members           //查看consul羣集中的成員信息

三、docker02及docker03主機上以容器的方式運行consul服務

docker02的配置如下:

[root@docker02 ~]# docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600 -p 8600:8600/udp --restart always progrium/consul -join 192.168.1.1 -advertise 192.168.1.2 -client 0.0.0.0 -node=node01
//-join:指定加入的羣集主節點
//-advertise:聲明本機的Ip地址
//-node:羣集中的名稱

docker03的配置如下:

[root@docker03 ~]# docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600 -p 8600:8600/udp --restart always progrium/consul -join 192.168.1.1 -advertise 192.168.1.3 -client 0.0.0.0 -node=node02

注意:雖然docker01上的consul服務是二進制包安裝的,docker02和docker03採用容器的方式部署,只是爲了儘可能的展示部署方式而已!

在docker01進行查看:

[root@docker01 ~]# consul members          //查看consul羣集信息
Node    Address           Status  Type    Build  Protocol  DC   Segment
master  192.168.1.1:8301  alive   server  1.6.2  2         dc1  <all>
node01  192.168.1.2:8301  alive   client  0.5.2  2         dc1  <default>
node02  192.168.1.3:8301  alive   client  0.5.2  2         dc1  <default>

瀏覽器訪問測試:
Docker+Consul+Registrator實現服務自動註冊與發現

四、docker02及docker03主機上以容器的方式運行registrator服務

docker02的配置如下:

[root@docker02 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart always gliderlabs/registrator consul://192.168.1.2:8500
//將收集的容器信息發送給本機的8500端口來顯示

瀏覽器測試訪問:
Docker+Consul+Registrator實現服務自動註冊與發現
Docker+Consul+Registrator實現服務自動註冊與發現
docker03的配置如下:

[root@docker03 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart always gliderlabs/registrator consul://192.168.1.3:8500
//將收集的容器信息發送給本機的8500端口來顯示

瀏覽器測試訪問:
Docker+Consul+Registrator實現服務自動註冊與發現
Docker+Consul+Registrator實現服務自動註冊與發現

五、docker01部署Nginx服務,提供反向代理

[root@docker01 ~]# yum -y install pcre pcre-devel openssl openssl-devel zlib zlib-devel
[root@docker01 ~]# wget http://nginx.org/download/nginx-1.17.7.tar.gz
[root@docker01 ~]# useradd -M -s /sbin/nologin nginx
[root@docker01 ~]# tar zxf nginx-1.17.7.tar.gz -C /usr/src
[root@docker01 ~]# cd /usr/src/nginx-1.17.7/
[root@docker01 nginx-1.17.7]# ./configure --user=nginx --group=nginx --with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module && make && make install
[root@docker01 nginx-1.17.7]# cd
[root@docker01 ~]# ln -s /usr/local/nginx/sbin/nginx  /usr/local/sbin/
[root@docker01 ~]# nginx

六、在docker01安裝consul-template命令工具,並編寫模板

consul-template的作用就是將收集到的信息(把registrator收集到容器的信息)寫入template模板中,並且最終寫入Nginx的配置文件中。

[root@docker01 ~]# wget https://releases.hashicorp.com/consul-template/0.23.0/consul-template_0.23.0_linux_amd64.zip
[root@docker01 ~]# unzip consul-template_0.23.0_linux_amd64.zip 
[root@docker01 ~]# mv consul-template /usr/local/bin
[root@docker01 ~]# chmod +x /usr/local/bin/consul-template 
//獲取consul-template 命令
[root@docker01 ~]# cd /usr/local/nginx/
[root@docker01 nginx]# mkdir consul && cd consul
[root@docker01 consul]# vim nginx.ctmpl
upstream http_backend {
        {{range service "nginx"}}
        server {{ .Address }}:{{ .Port }};
        {{ end }}
}
server {
        listen 8000;
        server_name localhost;
        location / {
                proxy_pass http://http_backend;
        }
}
[root@docker01 consul]# vim ../conf/nginx.conf
        include /usr/local/nginx/consul/*.conf;   //調用生成的vhost.conf文件
}         //必須在末尾的大括號中添加
[root@docker01 consul]# nohup consul-template -consul-addr 192.168.1.1:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload" &
[2] 64430
[root@docker01 consul]# nohup: 忽略輸入並把輸出追加到"nohup.out"

[root@docker01 consul]# 
//同樣也是將這條命令放入後臺執行,否則會佔用前臺的終端
//這條命令的作用就i是將本機收集到的信息,生成一個vhost.conf的文件,將命令放入後臺才能保證實時發現同步並更新

七、驗證服務的實時發現功能

配置至此,docker02或者docker03上一旦有任何Nginx相關的容器以後臺“-d”的運行方式運行,都會被添加到反向代理中來,進行調度,一旦容器發生意外關閉,則可以自動從反向代理配置文件中剔除。

現在可以在docker02、和docker03上分別運行兩臺Nginx容器,其容器名稱依次爲web01、web02.......,其網頁文件依次爲:web01、web02……爲其準備不同的網頁文件的目的就是方便客戶端訪問時區分訪問的是哪臺容器。

由於其配置過程類似,我這裏就寫出一個運行Nginx容器的過程,其他照做即可!

[root@docker02 ~]# docker run -itd --name web01 -P nginx
[root@docker02 ~]#  docker exec -it web01 /bin/bash
root@b49445d94603:/# echo "web01" > /usr/share/nginx/html/index.html

在docker02及docker03運行四個Nginx容器後(必須以後臺運行的方式,也就是說在運行時必須有“-d”選項),那麼,此時訪問docker01的8000端口,就會循環訪問到這四個容器提供的網頁文件,如下:

[root@docker01 consul]# curl 127.0.0.1:8000
web01
[root@docker01 consul]# curl 127.0.0.1:8000
web02
[root@docker01 consul]# curl 127.0.0.1:8000
web03
[root@docker01 consul]# curl 127.0.0.1:8000
web04
[root@docker01 consul]# cat /usr/local/nginx/consul/vhost.conf 
upstream http_backend {

        server 192.168.1.2:32768;

        server 192.168.1.2:32769;

        server 192.168.1.3:32768;

        server 192.168.1.3:32769;

}
server {
        listen 8000;
        server_name localhost;
        location / {
                proxy_pass http://http_backend;
        }
}
//由於consul-template是在後臺運行的,所以,只要檢測到容器的變化,就會動態修改上述文件
//並且重啓Nginx服務,使更改生效

現在就已經配置完成了,docker02和docker03上創建和刪除容器,vhost.conf文件都會動態的進行修改,自行測試!

——————————本文到此結束,感謝閱讀——————————

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