溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

基于docker服務(wù)配置Consul+registrator實(shí)時(shí)服務(wù)發(fā)現(xiàn)

發(fā)布時(shí)間:2020-05-17 08:52:51 來源:網(wǎng)絡(luò) 閱讀:995 作者:warrent 欄目:云計(jì)算

Consul是用于服務(wù)發(fā)現(xiàn)和配置的工具。Consul是分布式的,高度可用的,并且具有極高的可伸縮性。

Consul服務(wù)提供以下關(guān)鍵特性:

  • 服務(wù)發(fā)現(xiàn):Consul 的客戶端可用提供一個(gè)服務(wù),比如 api 或者mysql ,另外一些客戶端可用使用 Consul 去發(fā)現(xiàn)一個(gè)指定服務(wù)的提供者.通過 DNS 或者 HTTP 應(yīng)用程序可用很容易的找到他所依賴的服務(wù);
  • 健康檢查:Consul 客戶端可用提供任意數(shù)量的健康檢查,指定一個(gè)服務(wù)(比如: webserver 是否返回了200 OK 狀態(tài)碼)或者使用本地節(jié)點(diǎn)(比如:內(nèi)存使用是否大于90%). 這個(gè)信息可由 operator用來監(jiān)視集群的健康.被服務(wù)發(fā)現(xiàn)組件用來避免將流量發(fā)送到不健康的主機(jī);
  • Key/Value存儲(chǔ):應(yīng)用程序可用根據(jù)自己的需要使用 Consul 的層級(jí)的 Key/Value 存儲(chǔ).比如動(dòng)態(tài)配置,功能標(biāo)記,協(xié)調(diào),領(lǐng)袖選舉等等,簡(jiǎn)單的 HTTP API 讓他更易于使用;
  • 多數(shù)據(jù)中心:Consul支持開箱即用的多數(shù)據(jù)中心.這意味著用戶不需要擔(dān)心需要建立額外的抽象層讓業(yè)務(wù)擴(kuò)展到多個(gè)區(qū)域。

關(guān)于Consul服務(wù)就不多介紹了,若想了解其更多功能,可移步至Consul官網(wǎng) 。

博文大綱:
一、環(huán)境準(zhǔn)備
二、在Docker01上執(zhí)行二進(jìn)制命令部署consul服務(wù)
三、在docker02及docker03主機(jī)上以容器的方式運(yùn)行consul服務(wù)
四、在docker02及docker03主機(jī)上以容器的方式運(yùn)行registrator服務(wù)
五、在主機(jī)docker01上部署Nginx服務(wù),以便提供反向代理
六、在docker01安裝consul-template命令工具,并編寫模板
七、驗(yàn)證服務(wù)的實(shí)時(shí)發(fā)現(xiàn)功能

一、環(huán)境準(zhǔn)備

基于docker服務(wù)配置Consul+registrator實(shí)時(shí)服務(wù)發(fā)現(xiàn)

其工作示意圖如下:
基于docker服務(wù)配置Consul+registrator實(shí)時(shí)服務(wù)發(fā)現(xiàn)

上面示意圖的大概流程如下:
1、docker01主機(jī)上以二進(jìn)制包的方式部署consul服務(wù)并后臺(tái)運(yùn)行,其身份為leader;
2、docker02、docker03以容器的方式運(yùn)行consul服務(wù),并加入到docker01的consul群集中;
3、在主機(jī)docker02、docker03上后臺(tái)運(yùn)行registrator容器,使其自動(dòng)發(fā)現(xiàn)docker容器提供的服務(wù);
4、在docker01上部署Nginx,提供反向代理服務(wù),docker02、docker03主機(jī)上基于Nginx鏡像,各運(yùn)行兩個(gè)web容器,提供不同的網(wǎng)頁文件,以便測(cè)試效果;
5、在docker01上安裝consul-template命令,將收集到的信息(registrator收集到容器的信息)寫入template模板中,并且最終寫入Nginx的配置文件中。
6、至此,實(shí)現(xiàn)客戶端通過訪問Nginx反向代理服務(wù)器(docker01),獲得docker02、docker03服務(wù)器上運(yùn)行的Nginx容器提供的網(wǎng)頁文件。
注:registrator是一個(gè)自動(dòng)發(fā)現(xiàn)docker container提供的服務(wù),并且在后端服務(wù)注冊(cè)中心(數(shù)據(jù)中心)注冊(cè)服務(wù)。主要用來收集容器運(yùn)行服務(wù)的信息,并且發(fā)送給consul。數(shù)據(jù)中心除了consul外,還有etcd、zookeeper等。

在開始之前,請(qǐng)先下載博文中配置所需要的源碼包。

二、在Docker01上執(zhí)行二進(jìn)制命令部署consul服務(wù)

[root@docker01 ~]# rz          #上傳我提供的壓縮包
[root@docker01 ~]# unzip consul_1.5.1_linux_amd64.zip    #解包,解壓后會(huì)得到一個(gè)命令
[root@docker01 ~]# mv consul /usr/local/bin/    #移動(dòng)到命令存放路徑
[root@docker01 ~]# chmod +x /usr/local/bin/consul    #賦予其執(zhí)行權(quán)限
[root@docker01 ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.20.6 -client=0.0.0.0 -node=master &
[1] 8330
[root@docker01 ~]# nohup: 忽略輸入并把輸出追加到"nohup.out"    
#執(zhí)行命令后,會(huì)提示該信息,并占用終端,按回車鍵即可,
#運(yùn)行上述命令后,會(huì)在當(dāng)前目錄下生成一個(gè)名為“nohup.out”的文件,其存放的是consul服務(wù)的運(yùn)行日志
#執(zhí)行上述命令后,consul就放到后臺(tái)運(yùn)行了,并返回其PID號(hào),可以通過“jobs -l”命令進(jìn)行查看

上述命令的相關(guān)參數(shù)解釋如下:

  • -server:添加一個(gè)服務(wù);
  • -bootstrap:一般在server單節(jié)點(diǎn)的時(shí)候使用,自選舉為leader;
  • -ui:開啟內(nèi)部的web界面;
  • -bind:指定開啟服務(wù)的IP(就是本機(jī)IP咯);
  • -client:指定服務(wù)的客戶端(一般此處為任意);
  • -node:在集群內(nèi)部通信使用的名稱,默認(rèn)是主機(jī)名。
    開啟的端口作用如下:
  • 8300:集群節(jié)點(diǎn);
  • 8301:集群內(nèi)部訪問的端口;
  • 8302:跨數(shù)據(jù)中心之間的通信;
  • 8500:http_ui;
  • 8600:DNS。

附加查詢兩條查詢命令:

[root@docker01 ~]# consul info    #可以看到這個(gè)群集的leader及版本信息
#如:leader_addr = 192.168.20.6:8300
[root@docker01 ~]# consul members          #查看集群內(nèi)部信息

至此,客戶端可以訪問docker01的8500端口進(jìn)行驗(yàn)證,會(huì)看到以下頁面:

基于docker服務(wù)配置Consul+registrator實(shí)時(shí)服務(wù)發(fā)現(xiàn)

三、在docker02及docker03主機(jī)上以容器的方式運(yùn)行consul服務(wù)

###################  docker02服務(wù)器配置如下  #####################
[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.20.6 -advertise 192.168.20.7 -client 0.0.0.0 -node=node01
#上述命令中,“-join”是指定leader的IP地址(也就是docker01);“-advertise”是指定自己本身的IP地址
###################  docker03服務(wù)器配置如下  #####################
[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.20.6 -advertise 192.168.20.8 -client 0.0.0.0 -node=node02
#與docker02主機(jī)執(zhí)行的命令類似,但是改成了自己的IP,及node名稱改了
#注意:node名稱在consul群集中,必須唯一。

注:主機(jī)docker01的consul服務(wù)也可以采用容器的方式部署,這里只是為了展示其多種部署方式而已。

至此,在docker01主機(jī)上,執(zhí)行“consul members”命令,即可查看到docker02及docker03的信息,如下:

[root@docker01 ~]# consul members        #執(zhí)行該命令
Node    Address            Status  Type    Build  Protocol  DC   Segment
master  192.168.20.6:8301  alive   server  1.5.1  2         dc1  <all>
node01  192.168.20.7:8301  alive   client  0.5.2  2         dc1  <default>
node02  192.168.20.8:8301  alive   client  0.5.2  2         dc1  <default>

客戶端訪問192.168.20.6的8500端口,通過以下操作,也可看到docker02或03主機(jī)上所有與docker容器相關(guān)的端口:

基于docker服務(wù)配置Consul+registrator實(shí)時(shí)服務(wù)發(fā)現(xiàn)

基于docker服務(wù)配置Consul+registrator實(shí)時(shí)服務(wù)發(fā)現(xiàn)

四、在docker02及docker03主機(jī)上以容器的方式運(yùn)行registrator服務(wù)

#############  主機(jī)docker02配置如下  #############
[root@docker02 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator consul://192.168.20.7:8500
#上述命令的作用是將收集的容器信息發(fā)送給本機(jī)的8500端口來顯示
#############  主機(jī)docker03配置如下  #############
[root@docker03 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator consul://192.168.20.8:8500
#同docker02,將收集的容器信息發(fā)送給本機(jī)的8500端口來顯示

五、在主機(jī)docker01上部署Nginx服務(wù),以便提供反向代理

部署Nginx服務(wù),這里就不寫注釋了,若想優(yōu)化Nginx服務(wù),可以參考博文:Nginx安裝及深度優(yōu)化

[root@docker01 ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src
[root@docker01 ~]# useradd -M -s /sbin/nologin www
[root@docker01 ~]# cd /usr/src/nginx-1.14.0/
[root@docker01 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module && make && make install
[root@docker01 nginx-1.14.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@docker01 nginx-1.14.0]# nginx

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

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

1、生成consul-template命令工具(若要安裝新版本的請(qǐng)移步Consul模板發(fā)布頁面,下載最新版本使用):

[root@docker01 ~]# rz           #上傳我提供的包
[root@docker01 ~]# unzip consul-template_0.19.5_linux_amd64.zip     #解包
[root@docker01 ~]# mv consul-template /usr/local/bin/   #移動(dòng)到命令搜索路徑
[root@docker01 ~]# chmod +x /usr/local/bin/consul-template    #賦予執(zhí)行權(quán)限

2、在Nginx安裝目錄下,編寫模板供consul-template命令工具使用,并且配置Nginx反向代理:

[root@docker01 ~]# cd /usr/local/nginx/
[root@docker01 nginx]# mkdir consul
[root@docker01 nginx]# cd consul/
[root@docker01 consul]# vim nginx.ctmpl    #新建一個(gè)模板文件
upstream http_backend {
  {{range service "nginx"}}            #這里的“Nginx”是基于docker鏡像進(jìn)行搜索的,而不是容器的名稱
  server {{.Address}}:{{.Port}};
  {{ end }}
}
#以上是go語言編寫的,目的是為了收集Nginx相關(guān)的IP地址及端口信息
#下面是定義反向代理
server {
  listen 8000;               #監(jiān)聽地址可任意指定,不要沖突即可
  server_name localhost;
  location / {
  proxy_pass http://http_backend;
  }
}
#編輯完成后,保存退出即可
[root@docker01 consul]# nohup consul-template -consul-addr 192.168.20.6:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload" &
#將本機(jī)收集到的信息,生成一個(gè)vhost.conf文件
#此服務(wù)必須在后臺(tái)運(yùn)行,才可實(shí)現(xiàn)服務(wù)的實(shí)時(shí)發(fā)現(xiàn)與更新
[root@docker01 consul]# vim ../conf/nginx.conf        #在主配置文件中進(jìn)行調(diào)用生成的vhost.conf文件
include /usr/local/nginx/consul/*.conf;
}             #在配置文件末尾的花括號(hào)上方寫入“include”配置,進(jìn)行調(diào)用vhost.conf文件

七、驗(yàn)證服務(wù)的實(shí)時(shí)發(fā)現(xiàn)功能

配置至此,docker02或者docker03上一旦有任何Nginx相關(guān)的容器以后臺(tái)“-d”的運(yùn)行方式運(yùn)行,都會(huì)被添加到反向代理中來,進(jìn)行調(diào)度,一旦容器發(fā)生意外關(guān)閉,則可以自動(dòng)從反向代理配置文件中剔除。

現(xiàn)在可以在docker02、和docker03上分別運(yùn)行兩臺(tái)Nginx容器,其容器名稱依次為web01、web02.......,其網(wǎng)頁文件依次為:this is web01 test、this is web02 test..........

為其準(zhǔn)備不同的網(wǎng)頁文件的目的就是方便客戶端訪問時(shí)區(qū)分訪問的是哪臺(tái)容器。

由于其配置過程類似,我這里就寫出一個(gè)運(yùn)行Nginx容器的過程,其他照做即可。

配置示例如下(運(yùn)行web01并修改其首頁文件):

[root@docker02 ~]# docker run -d -P --name web01 nginx
[root@docker02 ~]# docker exec -it web01 /bin/bash
root@ff910228a2b2:/# echo "this is a web01 test." > /usr/share/nginx/html/index.html 

在docker02及docker03運(yùn)行四個(gè)Nginx容器后(必須以后臺(tái)運(yùn)行的方式,也就是說在運(yùn)行時(shí)必須有“-d”選項(xiàng)),那么,此時(shí)訪問docker01的8000端口,就會(huì)循環(huán)訪問到這四個(gè)容器提供的網(wǎng)頁文件,如下:

[root@docker01 consul]# curl 192.168.20.6:8000
this is a web01 test.
[root@docker01 consul]# curl 192.168.20.6:8000
this is a web02 test.
[root@docker01 consul]# curl 192.168.20.6:8000
this is a web03 test.
[root@docker01 consul]# curl 192.168.20.6:8000
this is a web04 test.
[root@docker01 consul]# curl 192.168.20.6:8000
this is a web01 test.
[root@docker01 consul]# curl 192.168.20.6:8000
this is a web02 test.
#并且查看以下文件,會(huì)看到其中的配置
[root@docker01 consul]# pwd
/usr/local/nginx/consul
[root@docker01 consul]# cat vhost.conf     #以下web池中的server都是基于編寫的模板自動(dòng)生成的
upstream http_backend {

  server 192.168.20.7:32768;

  server 192.168.20.7:32769;

  server 192.168.20.8:32768;

  server 192.168.20.8:32769;

}

server {
  listen 8000;
  server_name localhost;
  location / {
  proxy_pass http://http_backend;
  }
}
#由于consul-template是在后臺(tái)運(yùn)行的,所以,只要檢測(cè)到容器的變化,就會(huì)動(dòng)態(tài)修改上述文件
#并且重啟Nginx服務(wù),使更改生效

若現(xiàn)在刪除docker02及docker03所有Nginx容器,只保留一臺(tái)web01,然后再次訪問Nginx代理服務(wù)器的8000端口,則永遠(yuǎn)只能訪問到web01的網(wǎng)頁,并且查看vhost.conf文件,之前添加的server地址及端口也沒有了,如下(自行刪除或停止Nginx容器):

[root@docker01 consul]# cat vhost.conf         #該文件中只有web01容器的IP及端口信息了
upstream http_backend {

  server 192.168.20.7:32768;

}

server {
  listen 8000;
  server_name localhost;
  location / {
  proxy_pass http://http_backend;
  }
}
#多次訪問,也只能訪問到web01的頁面:
[root@docker01 consul]# curl 192.168.20.6:8000
this is a web01 test.
[root@docker01 consul]# curl 192.168.20.6:8000
this is a web01 test.
[root@docker01 consul]# curl 192.168.20.6:8000
this is a web01 test.
[root@docker01 consul]# curl 192.168.20.6:8000
this is a web01 test.

至此,consul+registrator+docker實(shí)時(shí)服務(wù)發(fā)現(xiàn)就配置完成了。

———————— 本文至此結(jié)束,感謝閱讀 ————————

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI