對於有多台服務器來講,如果每一台都去手動操控,那將會是一件非常浪費時間的事情,畢竟時間這東西,於我們而言,十分寶貴,或許在開始搭建環境的時候耗費點時間,感覺是正常的,我也如此,花費大堆時間在采坑和填坑的路上,但是當你踩完后,還通過手動管理的方式去維護,那便是折磨,因此對於多台服務器下的容器編排管理,借助工具將會節省着大把時間,現如今有名的容器編排工具,K8s、Docker Swarm,甚至功能更強大的Rancher,本次我將使用且是我唯一使用過的Docker Swarm工具搭建Docker集群並部署服務。
Docker Swarm官方文檔地址:https://docs.docker.com/engine/swarm/
一、搭建前期工作
在之前的文章中,對於一台新的服務器加入到服務器集群中,通過Docker Machine去管理,配置好Docker Enginee環境,簡單也方便,同時在配置時,將本地的私鑰發送給了新的服務器,也就配置好了關聯關系,如有需要可以查看該文章:https://www.cnblogs.com/CKExp/p/9552272.html

加入進來后對於整個服務器集群來講,可預見的Swarm方式是這樣的,也是最為簡便的方式管理,Manager作為容器集群發起者,也是管理者,一般來講,我會盡可能少的在上面部署服務,通過一些方式過濾掉服務在上面的部署,畢竟它的職責更多的側重於管理整個容器集群,但是對於一些開支小的且比較穩定的服務,也是可以i直接部署在Manager節點中的,這是一種建議。
這是我當前的服務器下的容器集群,存在一個Leader也就是Manager,也可以設置多個,但是現有場景下,完全滿足我的需求了。

我們利用Docker Swarm中的Docker CLI去創建集群、管理集群、動態擴容服務。而對於Swarm的版本,建議是Docker版本要高於1.13,在1.13之上,將Swarm功能集成到了Docker中,而對於1.13之下,需要單獨設置Swarm模式,在此建議,使用1.13之上的版本。
在Swarm中有幾個名字概念:
Node:節點,分為Manager Node和Worker Node,在上圖中有一個Manager節點和三個Worker節點,這個概念很好理解。
Service:服務,對於Swarm而言,部署服務是它對外的職責,對於整個集群來講,都是通過部署服務的形式,並且通過擴容、縮放來動態的決定服務數量。
Task:服務的具體承載,在於Manager節點將服務分發到具體的Worker節點上,屬於下達具體任務概念。相較於Service屬於微觀概念。
對於Swarm模式下,需要開啟幾個相關的端口,而在系統中,這幾個端口是默認打開的:
TCP Port 2377:用於集群間通信,
TCP 和UDP Port 7946:用於節點間通信,
UDP Port 4789:用於Overlay網絡方式下通信,這個是在集群模式下的網絡通信方式,單機下采用的是Bridge方式。
二、開始搭建Swarm
在需要設置為Manager的節點上輸入如下命令,開始容器集群搭建,IP地址寫現在服務對外IP。
$ docker swarm init --advertise-addr <MANAGER-IP>
可以獲得如下信息,集群創建完畢,復制該命令,在其他子節點上執行完畢,子節點便是加入了該容器集群(可通過docker-machine ssh xxx的方式快速進入到目的節點中執行)。

對所有節點加入完畢,通過docker node ls命令查看節點信息,加入的節點和本身節點將會顯示出來。
如果有新的服務器加入了,並且已經安裝好了docker enginee需要加入到節點中且忘記了這一條token的值,可以通過在manager上執行該命令再次獲得這個值
docker swarm join-token worker

至此,整個容器集群就搭建完畢,Manager節點和Worker節點都接入進來了。
三、部署服務到集群
進入到Manager節點,開始部署一個服務到容器集群中,通過如下命令創建一個服務:
$ docker service create --replicas 1 --name helloworld alpine ping docker.com
命令解讀:
1、docker service create:用於創建服務;
2、--replicas 用於確定需要多少個節點容器去運行服務;
3、對於參數alpine ping docker.com 則是指定alpine鏡像,並在容器啟動后執行ping docker.com操作;
通過docker service ls查看當前創建的所有服務,可以通過docker service remove 服務名或ID的形式移除服務,這類操作和Docker的操作是差不多的。

通過docker service inspect --pretty 服務名或ID方式查看服務的詳細信息,

在不帶--pretty參數下,可以查看到Json格式的詳細信息,

通過命令docker service ps 服務名或ID查看服務運行狀態,

四、對承載服務的批量容器相關操作
1、擴容/伸縮現有服務承載容器數量
通過scale命令執行,並再次查看服務運行信息:
docker service scale 服務名或ID=實例數量

2、滾動更新使用服務使用鏡像版本,本次重新搭建一個redis服務,用四個實例承載服務,並通過滾動升級redis版本。

對於--update-delay 為更新前后切換時間,對於后面跟隨的時間類型可以有時分秒如10h10m10s,
通過--update -parallelism參數可以指定最大的實例更新數量,如本次中有四個實例,指定為2后將最大允許兩個實例更新到新版本中,
更新實例版本規則,當一個實例更新完畢並返回running才繼續更新下一個實例,如果有一個實例更新失敗,整個更新隊列將會中止,可以通過--update-failure-action參數指定更新失敗后的解決方式,如docker swarm create或是update服務。
服務創建后實例運行結果結果

現在開始更新版本:
docker service update --image redis:3.0.7 redis

指定新版本鏡像及現有服務名稱,開始更新,查看當前服務運行情況,四個redis均完成更新。

接下來,通過控制worker節點的狀態來控制是否承載某一個服務,通過如下命令,將現有節點下的host1不再承載redis服務,命令如下
docker node update --availability drain host1
通過參數--availability指定為drain(置空)來設置host1節點不參與服務承載,如下可以看到原有服務已經移交到manager節點下了。

然后啟用該host1節點恢復為活躍模式,但是該節點不會再去承載redis服務,因為服務現在並不需要它去承載。
docker node update --availability active host1

至此,對於容器集群的搭建就此完成了。
對於容器集群的其他高級用法可以參見官方文檔:https://docs.docker.com/engine/swarm/services/#roll-back-to-the-previous-version-of-a-service
本文地址:https://www.cnblogs.com/CKExp/p/9651244.html
歡迎關注微信訂閱號,有新的文章將同步到訂閱號中

2018-10-27,望技術有成后能回來看見自己的腳步
