Docker - 容器部署 Consul 集群


說明

本文主要介紹怎么使用 DockerLinux 環境部署 Consul 集群,如果你對 Docker 不了解的同學,請先學習一下 Docker。推薦一本學習 Docker 在線書籍 :【Docker入門到實踐】

本文介紹 Consul 部署已經在准備好 Docker 環境好前提下開始的。

  • CentOS 7.3
  • Docker CE 18.09.2

簡介

image_1d78seg768pbqmr1le6on71p0h19.png-172.3kB

了解 Consul

Consul 是一個支持多數據中心分布式高可用的 服務發現配置共享 的服務軟件,由 HashiCorp 公司用 Go 語言開發, 基於 Mozilla Public License 2.0 的協議進行開源。 Consul 支持 健康檢查,並允許 HTTPGRPCDNS 協議調用 API 存儲鍵值對.
命令行超級好用的虛擬機管理軟件 vgrant 也是 HashiCorp 公司開發的產品.
一致性協議采用 Raft 算法,用來保證服務的高可用. 使用 GOSSIP 協議管理成員和廣播消息, 並且支持 ACL 訪問控制.

Consul 使用場景

  • Docker 實例的注冊與配置共享
  • Coreos 實例的注冊與配置共享
  • SaaS 應用的配置共享、服務發現和健康檢查。
  • vitess 集群
  • 與 confd 服務集成,動態生成 nginx 和 haproxy 配置文件

Consul 優勢

市面現在有很多類似的軟件比如:zookeeperEtcddoozerdeureka,Consul 相比這些軟件有什么優勢呢?
官方出了相比較這些軟件區別的一篇 Consul vs. ZooKeeper,doozerd,etcd 文章。

下面總結一下 Consul 的優勢有那幾點:

  • 使用 Raft 算法來保證一致性, 比復雜的 Paxos 算法更直接. 相比較而言, zookeeper 采用的是 Paxos, 而 etcd 使用的則是 Raft.

  • 支持 多數據中心,內外網的服務采用不同的端口進行監聽。 多數據中心集群可以避免單數據中心的單點故障,而其部署則需要考慮網絡延遲,分片等情況等. zookeeper 和 etcd 均不提供多數據中心功能的支持。

  • 支持 健康檢查。 etcd 不提供此功能。

  • 支持 HTTPDNSGPRS 協議接口。 zookeeper 的集成較為復雜,etcd 只支持 http 協議。

  • 官方提供 WEB管理界面,etcd 無此功能。

  • 綜合比較, Consul 作為服務注冊和配置管理的新星,比較值得關注和研究。

Consul 中的概念


image_1d78u4elv18glqtipc18f1aiv9.png-474.2kB

  • Client:表示 Consul 客戶端模式,是 Consul 節點的一種模式,所有注冊到 Client 節點的服務會被轉發到 Server 。本身無狀態不持久化如何數據。Client 通過 HTTP、DNS、GRPC 接口請求轉發給局域網內的服務端集群。

  • Server:表示 Consul 的服務端模式, Server 功能和 Client 都一樣,不同的是 Server 持久化數據到本地。在局域網內與本地 Client 通訊,通過廣域網與其他數據中心通訊。每個數據中心的 Server 數量推薦為 3 個或是 5 個。

  • Server-Leader :表示這個 Server 是它們的老大,它和其它 Server 不一樣的一點是,它需要負責同步注冊的信息給其它的 Server 節點,同時也要負責各個節點的健康監測。如果 Leader 宕機了,通數據中心的所有 Server 內部會使用 Raft 算法來在其中選取一個 Leader 出來。

  • Agent :Agent 是 Consul 的核心進程,Agent 的工作是維護成員關系信息、注冊服務、健康檢查、響應查詢等等。Consul 集群的每一個節點都必須運行 agent 進程。

  • 其它
    需要了解 Consul 原理、的通信方式、協議信息、算法、幫助文檔等。有興趣可以前往官方查看 官方文檔

文檔:https://www.consul.io/docs/agent/basics.html
官網:https://www.consul.io

安裝

准備 Consul 鏡像

拉取 Consul 鏡像到本地,我本次講解的是 Consul V1.4.4 版本。

$ docker pull consul:1.4.4
  1.4.4: Pulling from library/consul
  5d20c808ce19: Pull complete
  ded83912d17e: Pull complete
  a7fbb7ddd3ea: Pull complete
  6cdcd1f7ea42: Pull complete
  a0ea9ef64acd: Pull complete
  267ee3fb0b30: Pull complete
  Digest: sha256:9113b1043308b4193d2be8516c64fcdc2e9740e3c626be058076de697c407be7
  Status: Downloaded newer image for consul:1.4.4

Consul 鏡像提供了幾個個常用環境變量

  • CONSUL_CLIENT_INTERFACE :配置 Consul 的 -client=<interface ip> 命令參數。
  • CONSUL_BIND_INTERFACE :配置 Consul 的 -bind=<interface ip> 命令參數。
  • CONSUL_DATA_DIR :配置 Consul 的數據持久化目錄。
  • CONSUL_CONFIG_DIR:配置 Consul 的配置文件目錄。

Consul 鏡像的詳細說明請前往官方使用文檔

安裝單個 Consul

先啟動一個單機版 Consul,由於單機肯定需要安裝 Server 模式的 Consul。

啟動 Consul 和 Web 管理器

我們啟動一個命名為 consul_server_1 的 Docker 容器來運行 Consul ,啟動的 Consul 的版本是 1.4.4CONSUL_BIND_INTERFACE 設置為默認橋接網絡 eth0 並且主機上不顯示任何服務。

$ docker run -d -p 8500:8500 -v /data/consul:/consul/data -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_1 consul:1.4.4 agent -server -bootstrap -ui -node=1 -client='0.0.0.0'
  9e86237f42d3c2cefab5de0dc9888d2bd4ed3e7a1aa2ca8e1ebc54cef9ea47b7

提示:/consul/data 是 Consul 持久化地方,如果需要持久化那 Dooker 啟動時候需要給它指定一個數據卷 -v /data/consul:/consul/data

Consul 命令簡單介紹

  • agent : 表示啟動 Agent 進程。
  • -server:表示啟動 Consul Server 模式。
  • -client:表示啟動 Consul Cilent 模式。
  • -bootstrap:表示這個節點是 Server-Leader ,每個數據中心只能運行一台服務器。技術角度上講 Leader 是通過 Raft 算法選舉的,但是集群第一次啟動時需要一個引導 Leader,在引導群集后,建議不要使用此標志。
  • -ui:表示啟動 Web UI 管理器,默認開放端口 8500,所以上面使用 Docker 命令把 8500 端口對外開放。
  • -node:節點的名稱,集群中必須是唯一的。
  • -client:表示 Consul 將綁定客戶端接口的地址,0.0.0.0 表示所有地址都可以訪問。
  • -join:表示加入到某一個集群中去。 如:-json=192.168.1.23

Web 管理器

上面命令已經啟動了 Consul 和 Web 管理器,我們現在打開 Web 管理器來看一下是否啟動成功。通過瀏覽器瀏覽 Http://{serverIp}:8500

image_1d79to3v33sr78lgahfmeojr3m.png-37.8kB

上圖顯示已經啟動成功了,啟動了一個節點名稱為 -node=1 的節點 ,並且可以通過管理器管理 Node 節點、Key/Value 功能等。
這里就不講怎么使用 Consul ,我在附件中引用幾篇文章你可以去看看,更細化怎么使用可以去查相關資料。

組裝集群 Consul

上面完成了一個單機版的 Consul 部署,下面我們將實現圖中的的集群架構 Consul 部署。

image_1d793pdkjsujv9n1trud848uf12.png-215.7kB

Server 加入集群

我們在上面單機版的基礎上面來拓展集群,這樣可以模擬集群的一步一步發展。下面我將加入二個 Server 模式的 Consul 到集群中,Server 模式在集群中建議是 三個以上,這樣更好的避免因為 Server 的宕機導致整個集群掛掉的風險。

  1. 通過命令查一下當前運行 Consul 集群信息

    $ docker exec consul_server_1 consul members
      Node  Address          Status  Type    Build  Protocol  DC   Segment
      1     172.17.0.2:8301  alive   server  1.4.4  2         dc1  <all>
    
  2. 加入到集群, 命名為 -node=2-node=3
    上面通過命令獲取到引導 Consul 的 Ip 地址 172.17.0.2

    // -node=2
    $ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_2 consul:1.4.4 agent -server -node=2  -join='172.17.0.2'
      5d999ade4f96e04b5a1dbbcb69dc117fafa11d450fd17268884b1254971a7450
      
    // -node=3
    $ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_3 consul:1.4.4 agent -server -node=3  -join='172.17.0.2'
      459948e6bd26e2b0b556ac6b4c5593b5dba2e4dc2b79d506d6ba4644f4ab0970
    
  3. 通過 Web 管理器查看是否成功加入集群中
    image_1d79vfuaf1cl9vgpv2jg2r1aqd5a.png-19kB

Client 加入集群

Client 在 Consul 集群中起到了代理 Server 的作用,Client 模式不持久化數據。一般情況每台應用服務器都會安裝一個 Client ,這樣可以減輕跨服務器訪問帶來性能損耗。也可以減輕 Server 的請求壓力。

  1. 加入集群

    $ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_4 consul:1.4.4 agent -client -node=4 -join='172.17.0.2' -client='0.0.0.0'
      6e0604490eb49363d28249a5277c03173b258aa55965d70eb5b5438a0a6b7eea
      
    $ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_5 consul:1.4.4 agent -client -node=5 -join='172.17.0.2' -client='0.0.0.0'
      25e9792c6d5949ba3fcf73432ed2933568726d214d6819ab52d2b6eaa00d7842
      
    $ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_6 consul:1.4.4 agent -client -node=5 -join='172.17.0.2' -client='0.0.0.0'
      c7333068c1679f8f9e8c8c0be0fcf68f93f85b2c45dd177e4757217bdfa55d7a
    
  2. 檢查 Client 是否加入集群中

    $ docker exec consul_server_1 consul members
    Node          Address          Status  Type    Build  Protocol  DC   Segment
    1             172.17.0.2:8301  alive   server  1.4.4  2         dc1  <all>
    2             172.17.0.3:8301  alive   server  1.4.4  2         dc1  <all>
    3             172.17.0.4:8301  alive   server  1.4.4  2         dc1  <all>
    25e9792c6d59  172.17.0.6:8301  alive   client  1.4.4  2         dc1  <default>
    6e0604490eb4  172.17.0.5:8301  alive   client  1.4.4  2         dc1  <default>
    c7333068c167  172.17.0.7:8301  alive   client  1.4.4  2         dc1  <default>
    

總結

Docker 部署 Consul 其實很簡單,Consul 集群的配置主要是 Consul 的命令需要了解,建議多看看 Consul 的官方文檔。

引用和附件

  1. Consul 原理和使用簡介 : https://blog.coding.net/blog/intro-consul?type=hot
  2. Consul 鏡像倉庫地址 :https://hub.docker.com/_/consul
  3. Consul 鏡像使用文檔:https://github.com/docker-library/docs/tree/master/consul
  4. Consul 官方文檔 :https://www.consul.io/docs/agent/basics.html
  5. 使用Consul和Registration對Docker容器進行服務發現
    https://livewyer.io/blog/2015/02/05/service-discovery-docker-containers-using-consul-and-registrator
  6. 基於Consul+Registrator+Nginx實現容器服務自動發現的集群框架
    http://www.mamicode.com/info-detail-2222200.html
  7. .NET Core微服務之基於Consul實現服務治理
    https://www.cnblogs.com/edisonchou/p/9124985.html

【版權聲明】 
作品來自於長沙.NET技術社區成員【阿凌】,有興趣了解長沙.NET技術社區詳情,請關注公眾號【DotNET技術圈】,作品版權歸作者和博客園共有,作品采用知識共享署名-非商業性使用-相同方式共享4.0 國際許可協議進行許可。 

>原文:https://www.cnblogs.com/lfzm/p/10633595.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM