看 Docker Swarm 如何做集群

ArlPegues 7年前發布 | 23K 次閱讀 Docker Docker Swarm

看 Docker Swarm 如何做集群

本文所有服務均采用docker容器化方式部署

當前環境

  1. Mac OS 10.11.x
  2. Docker >= 1.12

目錄

  • 基本概念
  • 安裝
  • 使用場景
  • 分配策略
  • 高可用
  • 總結

基本概念

技術說明

  • Docker Engine:作為 Docker 鏡像構建與容器化啟動的工作引擎;
  • Docker Machine:安裝與管理 Docker Engine 的工具;
  • Docker Swarm:是 Docker 自1.12后自帶的集群技術,將多個獨立的 Docker Engine 利用 Swarm 技術進行集群化管理;

原理

簡單來講,Docker 集群的實現是通過 Docker Machine 在多主機或虛擬機上創建多個 Docker Engine,在利用 Docker Swarm 以某個 Engine 作為集群的初始管理節點,其他 Engine 以管理或工作節點的方式加入,形成完成的集群環境。

安裝(本次演示在單臺 Mac 上進行)

創建 Docker Engine

使用 docker-machine 命令創建 docker 工作引擎。

參數說明:

-d:設置 Docker Engine 驅動(Mac 下默認是 virtualbox)

--virtualbox-boot2docker-url:設置驅動地址( 如果默認驅動下載很慢,可以更改國內的下載路徑

下面創建4個引擎,1個集群管理者和3個工作者: ??

docker-machine create -d virtualbox manager1
docker-machine create -d virtualbox worker1
docker-machine create -d virtualbox worker2
docker-machine create -d virtualbox worker3

查看運行結果(docker-machine ls):

初始化集群

  • 連接 manager1
eval $(docker-machine env manager1)

查看運行結果:

  • 創建 swarm
docker swarm init --advertise-addr 192.168.99.100

參數說明:

--advertise-addr:設置管理節點的對外IP,供集群中的其他節點訪問;

命令說明:

該命令會創建一個新的 swarm,以當前節點作為 swarm 的管理節點。同時生成2個 token (manager/worker)供其他節點加入使用( 查詢token命令 docker swarm join-token )。

查看集群節點狀況(docker node ls):

加入工作節點

連接 worker1

eval $(docker-machine env worker1)

加入 swarm

docker swarm join \ --token WORKER_TOKEN \ 192.168.99.100:2377</pre>

同上,將其余兩個以 worker 身份加入

查看集群節點狀況( 僅可在管理節點下查看 ):

移除節點

如果想要移除集群下的某個節點,可在該節點環境下,執行該命令:

$ eval $(docker-machine env worker3)

當前環境在 worker3 上

docker swarm leave</pre>

查看集群節點狀況

重新加入集群

加入 swarm

docker swarm join \ --token WORKER_TOKEN \ 192.168.99.100:2377</pre>

查看集群節點狀況

移除無效節點

docker node rm INVALID_ID

查看集群節點狀況

使用場景

關于 swarm 集群的搭建已經完成了,接下來就是啟動服務。啟動服務的模式分為:replicated 和 global。

replicated(默認方式):先在一個 node 節點上創建一個服務,通過復制的方式進行擴展,這中間涉及擴展的策略。

global:在每個 node 節點上都會創建一個服務,像 Registrator(自動注冊服務) 就很適合用這種方式執行。

以 gobal 方式創建 nginx 服務

docker service create --mode=global --name=web nginx

查看服務啟動情況(每個節點都起了一個 web 服務):

以 replicated 方式創建 nginx 服務

  • 創建一個 nginx 服務
docker service create --name=web nginx

查看服務啟動情況:

  • 將服務依次擴展至5個
docker service scale nginx=2

查看服務啟動情況

docker service scale nginx=3

查看服務啟動情況

docker service scale nginx=4

查看服務啟動情況

docker service scale nginx=5

查看服務啟動情況

擴展分配策略

從服務的擴展可以看出,其中存在了一定的分配策略。這里采用的是默認的 Spread 策略。下面簡單描述下最常用的2種 Spread 與 BinPack。 

  • Spread:依據節點個數進行平均分配。

    • 優勢:在容器使用資源相對一致的情況下,整體資源使用在每個節點上做了平均的分配;
    • 不足:若每個容器所占資源相差很大,那么節點的資源使用率將存在明顯差異,導致資源使用的浪費;
    </li>
  • BinPack:盡可能的使用一個節點的資源,在節點資源不足的情況下,更換使用節點。

    • 優勢:節點資源能得到充分使用;
    • 不足:單節點的負重較高,而且每個節點性能未必都一樣,可能會分重CPU或重磁盤讀寫等。
    • </ul> </li> </ul>

      真實場景還是得依據具體的業務來合理使用分配策略。特殊情況,還需要搭配使用 filters、affinity 來具體選擇節點。 

      高可用

      服務的啟動都是通過 manager 節點將啟動服務分發給 worker 節點,而且服務的管理也是由manager節點來控制的。

      • manager 節點的可用性:我們可以設置多個 manager 節點。當 primary manager 掛掉后,secondary managers 中會選舉一個作為 primary manager,以保證服務的高可用性。

      • 服務高可用:服務如果啟動失敗,或中途異常中止,會進行自動重啟。保障了擴展服務的可用性。

      總結

      本文主要講述了如何使用 Docker Swarm 來做 docker 的集群管理。其中包括了集群部署、服務的啟動、擴展,以及常用的分配策略。

      swarm 在 docker 1.12開始被集成進了docker中。相比之前版本,以 docker run swarm create 啟動的方式,現節點與節點之間是通過內置的 DNS 發現機制進行通信,使用更為便捷。

      最后也提一下,使用 k8s 做容器集群管理的也在多數。這里不討論兩者的好壞,如果還沒用 k8s 的可以考慮使用 swarm,畢竟目前是docker 內置的服務。

       

      來自:https://github.com/jasonGeng88/blog/blob/master/201704/docker_swarm.md

       

 本文由用戶 ArlPegues 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!