簡介
consul是一個支持多數據中心分布式高可用的服務發現和配置共享的服務軟件,由HashiCorp公司用go語言開發,基於Mozilla Public License 2.0 的協議進行開源
特性
- Consul 支持健康檢查,並允許HTTP、GRPC和DNS 協議調用API 存儲鍵對值
- 一致性協議采用Raft 算法,用來保證服務的高可用
- 使用 GOSSIP 協議管理成員和廣播消息,並且支持ACL訪問控制
- consul的實例叫agent,agent有兩種運行模式:server和client
- 官方建議每個Consul Cluster數據中心至少有3個或以上的運行在Server Mode的Agent,Client節點不限。
consul使用場景
- Docker 容器的注冊與配置共享
- Coreos 實例的注冊與配置共享
- saas 應用的配置共享,服務發現和健康檢查
- vitess集群
- 與 confd 服務集成,動態生成 nginx 和 haproxy 配置文件
consul優勢
市面上現在有很多類似的軟件比如:zookeeper、Etcd、doozerd、eureka,Consul
相較於這些軟件,consul的優勢表現在以下幾點
- 使用 Raft 算法來保證一致性,比復雜的Paxoos 算法更直接,相比較而言,zookeeper 采用的是 Paxos,而 etcd 使用的則是 Raft。
- 支持 多數據中心,內外網的服務采用不同的端口進行監聽。 多數據中心集群可以避免單數據中心的單點故障,而其部署則需要考慮網絡延遲,分片等情況等. zookeeper 和 etcd 均不提供多數據中心功能的支持。
- 支持 健康檢查。 etcd 不提供此功能。
- 支持 HTTP、DNS 和 GPRS 協議接口。 zookeeper 的集成較為復雜,etcd 只支持 http 協議
- 官方提供 WEB管理界面,etcd 無此功能。
consul端口
| 端口 | 說明 |
| TCP/8300 | 8300端口用於服務器節點,客戶端通過該端口RPC協議調用服務端節點 |
| TCP/UDP/8301 | 8301端口用於單個數據中心所有節點之間的互相通信,即對LAN池信息的同步,他使得整個數據中心能夠自動發現服務器地址,分布式檢測節點故障,時間廣播(如領導選舉事件) |
| TCP/UDP/8302 | 8302端口用於單個或多個數據中心之間的服務器節點的信息同步,即對WAN池信息的同步,它針對互聯網的高延遲進行了優化,能夠實現跨數據中心請求 |
| 8500 | 8500端口基於HTP協議,用於API接口或web ui 訪問 |
| 8600 | 8600 端口作為DNS服務器,它使得我們可以通過節點查詢節點信息 |
consul參數詳解
- –net=host docker參數, 使得docker容器越過了net namespace的隔離,免去手動指定端口映射的步驟
- -server consul支持以server或client的模式運行, server是服務發現模塊的核心, client主要用於轉發請求
- -advertise 通告地址用於更改我們通告給集群中其他節點的地址。默認情況下,-bind地址是通告的。
- -retry-join 指定要加入的consul節點地址,失敗后會重試, 可多次指定不同的地址
- -client Consul將綁定客戶端接口的地址,包括HTTP和DNS服務器。默認情況下,這是“127.0.0.1”,只允許回送連接。
- -bind 內部集群通信綁定的地址。這是集群中所有其他節點都應該可以訪問的IP地址。默認情況下,這是“0.0.0.0”,集群內的所有節點到地址必須是可達的
- -bootstrap-expect 此標志提供數據中心中預期服務器的數量。不應該提供此值,或者該值必須與群集中的其他服務器一致。指定后,Consul將等待指定數量的服務器可用,然后啟動群集。允許自動選舉leader,但不能與傳統-bootstrap標志一起使用, 需要在server模式下運行。
- -data-dir 此標志為代理存儲狀態提供了一個數據目錄。這對所有代理都是必需的。該目錄在重新啟動時應該是持久的。這對於在服務器模式下運行的代理尤其重要,因為它們必須能夠保持群集狀態。此外,該目錄必須支持使用文件系統鎖定,這意味着某些類型的已裝入文件夾(例如VirtualBox共享文件夾)可能不合適
- -node 群集中此節點的名稱,這在群集中必須是唯一的,默認情況下是節點的主機名。
- -config-dir 指定配置文件,當這個目錄下有 .json 結尾的文件就會被加載
- -enable-script-checks 檢查服務是否處於活動狀態,類似開啟心跳
- -datacenter 數據中心名稱。如果未提供,則默認為“dc1”。Consul對多個數據中心擁有一流的支持,但它依賴於正確的配置。同一個數據中心內的節點應該位於單個局域網中。
- -ui - 啟用內置的Web UI服務器和所需的HTTP路由。這消除了將Consul Web UI文件與二進制文件分開維護的需要。
- -join 指定ip, 加入到已有的集群中
一、基於Docker的consul服務搭建
1.1、環境准備
| 服務器 | IP地址 | 安裝部署 |
|---|---|---|
| Consul 服務 | 20.0.0.10 | Docker-ce、Consul、Consul-template模板、nginx服務 |
| 容器服務 | 20.0.0.20 | Docker-ce |
准備兩台虛擬機,都提前部署了Docker-ce。
1.2、部署Consul服務
[root@node1 ~]# mkdir /root/consul [root@node1 ~]# cd /root/consul/ 將壓縮包導入此目錄

將壓縮包解壓,並創建代理agent
[root@node1 consul]# unzip consul_0.9.2_linux_amd64.zip Archive: consul_0.9.2_linux_amd64.zip inflating: consul [root@node1 consul]# mv consul /usr/bin/ #使consul命令可以在任何目錄下識別 [root@node1 consul]# consul agent \ > -server \ > -bootstrap \ > -ui \ > -data-dir=/var/lib/consul-data \ > -bind=20.0.0.10 \ > -client=0.0.0.0 \ > -node=consul-server01 &> /var/log/consul.log & [1] 64484 [root@node1 consul]# jobs [1]+ 運行中 consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=20.0.0.10 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log & [root@node1 consul]# netstat -anpt | grep 8500 tcp6 0 0 :::8500 :::* LISTEN 64484/consul
關閉防火牆及核心防護 [root@node1 consul]# systemctl stop firewalld [root@node1 consul]# setenforce 0 #查看集群成員信息 [root@node1 consul]# consul members Node Address Status Type Build Protocol DC consul-server01 20.0.0.10:8301 alive server 0.9.2 2 dc1 [root@node1 consul]# consul info | grep leader leader = true leader_addr = 20.0.0.10:8300
2、 容器自動加入nginx集群
在容器服務器上安裝 gliderlabs/registrator
- 檢查容器的運行狀態
- 自動注冊和注銷docker容器的服務到服務配置中心
[root@node2 ~]# docker run -d \ > --name=registrator \ > --net=host \ > -v /var/run/docker.sock:/tmp/docker.sock \ > --restart=always \ > gliderlabs/registrator:latest \ > -ip=20.0.0.20 \ #本機的ip地址 > condsul://20.0.0.10:8500 #指向consul服務器 Unable to find image 'gliderlabs/registrator:latest' locally latest: Pulling from gliderlabs/registrator Image docker.io/gliderlabs/registrator:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/ c87f684ee1c2: Pull complete a0559c0b3676: Pull complete a28552c49839: Pull complete Digest: sha256:6e708681dd52e28f4f39d048ac75376c9a762c44b3d75b2824173f8364e52c10 Status: Downloaded newer image for gliderlabs/registrator:latest 5c07ea8830b1ed48fe871bf81a691ed1831a084115710d46a96861de633814ed
測試
創建兩個容器。查看consul服務發現功能是否正常 docker run -itd -p:83:80 --name test-01 -h test01 nginx docker run -itd -p:84:80 --name test-02 -h test02 nginx

3、驗證consul 的服務發現功能
打開瀏覽器輸入http://20.0.0.10:8500,“單擊NODES”,然后單擊“consurl-server01”,出現3個服務,表示nginx服務已經注冊到consul里。

或者通過命令在consul服務器上查看當前提供的容器服務有哪些。

4、部署consul-template和nginx
- Consul-Template 是一個守護進程,用於實時查詢Consul 集群信息,並更新文件系統上任意數量的指定模板,生成配置文件。 更新完成以后,可以選擇運行shell 命令執行更新操作,重新加載Nginx。
- Consul-Template可以查詢 Consul 中的服務目錄、Key、Key-values 等。
- 這種強大的抽象功能和查詢語言模板可以使Consul-Template 特別適合動態的創建配置文件。
例如:創建Apache/Nginx Proxy Balancers、Haproxy Backends
4.1、准備template的nginx模板文件
vim /root/consul/nginx.ctmpl
server {
listen 88;
server_name localhost 20.0.0.10;
access_log /var/log/nginx/aa-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-Fprwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
~
4.2、對nginx進行編譯安裝
yum install -y gcc gcc-c++ pcre-devel zlib-devel tar zxvf nginx-1.12.2.tar.gz -C /opt/ cd /opt/nginx-1.12.2 ./configure --prefix=/usr/local/nginx make && make install vi /usr/local/nginx/conf/nginx.conf
http {
include mime.types;
include vhost/*.conf #添加 讓主配置文件能夠讀取子配置文件
4.3、創建主機目錄和日志文件目錄
//創建虛擬主機目錄 mkdir /usr/local/nginx/conf/vhost //創建日志文件目錄 mkdir /var/log/nginx ln -s /usr/local/nginx/sbin/nginx /usr/bin/ //啟動 nginx 服務 /usr/local/nginx/sbin/nginx
4.4 配置consul-template並啟動
cd /root/consul //解壓 unzip consul-template_0.19.3_linux_amd64.zip //使命令可以在任意目錄使用 mv consul-template /usr/bin/ //啟動服務,並指明nginx的配置文件名 consul-template -consul-addr 20.0.0.10:8500 \ -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \ --log-level=info

5、驗證consul-template的更新功能

測試:瀏覽器訪問http://20.0.0.10:88點擊刷新,后查看日志



6、增加一個nginx容器節點,測試監控發現功能
//在registrator服務端注冊(容器服務器) docker run -itd -p:90:80 --name test-08 -h test08 nginx


測試 刪除83端口容器

查看文件,配置文件自動移除

