1.什么是 Consul
Consul 是 service mesh(服務網格)的一個解決方案,它提供了諸如服務發現,配置和隔離等功能的一整套控制平面(control plane)。開發人員可以根據需要單獨使用這些功能點,也可以將他們整合成為一個完整的service mesh。Consul 需要一個數據平面(data plane),并支持代理和本地集成模型。Consul 自帶了一個簡單的代理以實現開箱即用的功能,不過它也支持集成第三方代理框架,比如Envoy。
Consul 的核心功能如下:
- 服務發現:?Consul 客戶端可以注冊一個服務,比如 api 接口或者 mysql 服務,其他的客戶端可以通過 Consul 來發現這些服務的提供方。通過 DNS 或者 HTTP,引用可以很方便地找到它所依賴的服務。
- 健康檢查:?Consul 客戶端可以提供任意數量的健康檢查,無論是特定服務(服務是否返回200狀態)還是本地節點(比如內存使用率是否大于90%)。運維人員可以通過這些信息管理集群的健康情況,服務發現組件也可以使用這些信息過濾掉不健康節點。
- KV 存儲:?應用可以使用 Consul 的樹狀 key/value 存儲做很多事情,比如動態配置,開關,協作,leader 選舉等等。KV 存儲使用的是 HTTP 接口,非常簡單易用。
- 服務通信加密:?Consul 可以生成并分發 TLS 證書給服務,從而保證服務之間使用 TLS 通信。我們可以使用?intentions 組件來自定義允許哪些服務訪問。使用 intentions 可以實時地操作服務隔離,這比使用復雜的網絡拓撲和靜態防火墻規則要簡單很多。
- 多數據中心?Consul 支持開箱即用的多數據中心功能。這意味著當工作區域擴展至多個的時候,用戶不需要費心去創建額外的抽象層來滿足多中心需求。
Consul 設計時就考慮到了對 DevOps 社區和應用開發者友好,這讓它非常適合新興的彈性架構。
2.Consul能解決什么問題
微服務帶來最大的好處就是把整個大項目分割成不同的服務,運行在不同服務器上,實現解耦和分布式處理。微服務雖然有很多好處,但是也會有不好的一方面。任何事物都會有兩面性,在微服務里面運維會是一個很大的難題,如果有一天我們的服務數量非常的多,然后我們又不知道哪一個服務在什么機器上。可能會有人說這部分直接寫在程序的配置里面就好了,當我們服務少的時候是可以這么做的,也允許這么做,但是在實際當中我們要盡量避免這么做,比如說我們某一個服務,地址換了,那么我們設計的相關代碼就得修改重新部署;又或者說我們有一天上線一個新服務或者下線一個服務,這時候我們又得修改程序代碼,這是非常不合理的做法。那么有沒有什么可以解決這樣的問題呢?這里就需要用到我們的服務注冊和發現了。
?
沒有服務注冊發現的結構
?
上面圖片我們可以看到在沒有服務注冊發現的時候一個調用者需要維護多個服務的ip和端口,這是非常不好的做法,當我們服務進行調整的時候就有可能導致服務調用失敗,還有服務器更換服務器,上下新服務,都會受到影響。將來某一個服務節點出現問題,排查對于程序和運維人員來說都是一場很大的災難,因為不知道哪一個節點出了問題,需要每一臺服務器的去排查。
而當我們有使用服務注冊發現之后的結構體是什么樣子的呢?
有服務注冊發現的結構
我們從上圖可以發現,當我們有注冊中心之后調用者不需要自己去維護所有服務的信息了,僅需要向注冊中心請求獲取服務,就可以拿到想要的服務信息。這樣當我們的服務有所調整,或者上線下線服務,都要可以輕松操作,并且可以在注冊中間檢查到服務的健康情況,幫助運維人員快速定位到故障的服務器。
第二點內容來自:https://www.sunnyos.com/article-show-85.html??
?
3.基于docker引擎搭建一個集群版的consul
3.1安裝docker引擎
https://www.cnblogs.com/gytangyao/p/10173937.html
3.2常用的命令行參數
-
-bootstrap-expect 數據中心中預期的服務器數。不應提供此值,或者該值必須與群集中的其他服務器一致。提供后,Consul將等待指定數量的服務器可用,然后引導群集。這允許自動選擇初始領導者。這不能與傳統-bootstrap標志一起使用。此標志需要在服務端模式下運行。
-
-server 以服務端模式啟動
-
-data-dir 數據存放位置,這個用于持久化保存集群狀態
-
-node 群集中此節點的名稱。這在群集中必須是唯一的。默認情況下,這是計算機的主機名。
-
-bind 綁定服務器的ip地址
-
-config-dir 指定配置文件服務,當這個目錄下有 .json 結尾的文件就會加載進來,更多配置可以參考?配置模版
-
-enable-script-checks 檢查服務是否處于活動狀態,類似開啟心跳
-
-datacenter 數據中心名稱
-
-client 客戶端可訪問ip,包括HTTP和DNS服務器。默認情況下,這是“127.0.0.1”,僅允許環回連接。
-
-ui 開啟web的ui界面
-
-join:加入到已有的集群中
完整的配置:https://www.consul.io/docs/agent/options.html
3.3開始配置集群
在宿主機上建立兩個文件夾,分別用于存儲consul的數據和配置? ?
在docker啟動時
/data/consul_data/data會映射到docker容器內部consul/data文件夾
/data/consul_data/conf會映射到docker容器內部consul/conf文件夾
mkdir -p /data/consul_data/data
mkdir -p /data/consul_data/conf
?
server節點的配置
3.3.1 master1
sudo docker run --net=host --restart always --name consul -v /data/consul_data/data:/consul/data -v /data/consul_data/conf:/consul/config -d docker.io/consul consul agent -server -bootstrap-expect=3 -data-dir /consul/data -config-dir /consul/config -ui -enable-script-checks=true -datacenter=dc1 -bind=192.168.161.128 -client=0.0.0.0 -node=master1
3.3.2 master2
sudo docker run --net=host --restart always --name consul -v /data/consul_data/data:/consul/data -v /data/consul_data/conf:/consul/config -d docker.io/consul consul agent -server -bootstrap-expect=3 -data-dir /consul/data -config-dir /consul/config -ui -enable-script-checks=true -datacenter=dc1 -bind=192.168.161.129 -client=0.0.0.0 -node=master2 -join 192.168.161.128
3.3.2 master3
sudo docker run --net=host --restart always --name consul -v /data/consul_data/data:/consul/data -v /data/consul_data/conf:/consul/config -d docker.io/consul consul agent -server -bootstrap-expect=3 -data-dir /consul/data -config-dir /consul/config -ui -enable-script-checks=true -datacenter=dc1 -bind=192.168.161.130 -client=0.0.0.0 -node=master3 -join 192.168.161.128
3.3.3錯誤排查和狀態查看
日志查看: sudo docker logs consul集群信息查看:進入容器內部:sudo docker exec -it consul /bin/sh查看集群成員:consul members
?
webui:http://192.168.161.128-130:8500
?
4.client節點
slave1
sudo docker run --net=host --restart always --name consul -v /data/consul_data/data:/consul/data -v /data/consul_data/conf:/consul/config -d docker.io/consul consul agent -data-dir /consul/data -config-dir /consul/config -ui -enable-script-checks=true -datacenter=dc1 -bind=192.168.161.200 -client=0.0.0.0 -node=slave1 -join 192.168.161.128
?
slave2
sudo docker run --net=host --restart always --name consul -v /data/consul_data/data:/consul/data -v /data/consul_data/conf:/consul/config -d docker.io/consul consul agent -data-dir /consul/data -config-dir /consul/config -ui -enable-script-checks=true -datacenter=dc1 -bind=192.168.161.201 -client=0.0.0.0 -node=slave2 -join 192.168.161.128
?
slave3
sudo docker run --net=host --restart always --name consul -v /data/consul_data/data:/consul/data -v /data/consul_data/conf:/consul/config -d docker.io/consul consul agent -data-dir /consul/data -config-dir /consul/config -ui -enable-script-checks=true -datacenter=dc1 -bind=192.168.161.202 -client=0.0.0.0 -node=slave3 -join 192.168.161.128
?