swarm容器集群創建與管理
前言【原創筆記-docker1.12.3】:
Docker Engine 1.12或更高版本中內置了集群管理和編排功能。Swarm模式側重於微服務架構。它支持服務協調,負載平衡,服務發現,內置證書循環等。Swarm模式是Docker以簡化的服務編排工具。
功能特點:
a.與Docker Engine集成的集群管理:
使用Docker Engine CLI創建一組Docker引擎,您可以在其中部署應用程序服務。您不需要其他編排軟體來創建或管理群集。
b.節點分散式設計:
Docker Engine不是在部署時處理節點角色之間的差異,而是在運行時處理角色變化。您可以使用Docker Engine部署兩種類型的節點,管理節點和工作節點。這意味著您可以從單個伺服器構建整個群集。
Advertisements
c.聲明性服務模型:
Docker Engine使用聲明性方法來定義應用程序堆棧中各種服務的所需狀態。例如,您可以描述由具有消息隊列服務和資料庫後端的Web前端服務組成的應用程序。
d.可擴容與縮放容器:
對於每個服務,您可以聲明要運行的任務數。當您向上或向下縮放時,swarm管理器通過添加或刪除任務來自動適應,以保持所需的任務數量來保證集群的可靠狀態。
e.容器容錯狀態協調:
群集管理器節點不斷監視群集狀態,並協調您表示的期望狀態的實際狀態之間的任何差異。例如,如果設置一個服務以運行容器的10個副本,並且託管其中兩個副本的工作程序計算機崩潰,則管理器將創建兩個新副本以替換崩潰的副本。 swarm管理器將新副本分配給正在運行和可用的worker節點上。
Advertisements
f.多主機網路:
您可以為服務指定覆蓋網路。當swarm管理器初始化或更新應用程序時,它會自動為覆蓋網路上的容器分配地址。
g.服務發現:
Swarm管理器節點為swarm中的每個服務分配唯一的DNS名稱,並負載平衡運行的容器。您可以通過嵌入在swarm中的DNS伺服器查詢在群中運行的每個容器。
### h.負載平衡:
您可以將服務的埠公開給外部負載平衡器。在內部,swarm允許您指定如何在節點之間分發服務容器。
m.預設安全:
群中的每個節點強制執行TLS相互驗證和加密,以保護其自身與所有其他節點之間的通信。您可以選擇使用自簽名根證書或來自自定義根CA的證書。
n.滾動更新:
在已經運行期間,您可以增量地應用服務更新到節點。 swarm管理器允許您控制將服務部署到不同節點集之間的延遲。如果出現任何問題,您可以將任務回滾到服務的先前版本。
2. 環境準備:
IP | 主機名 | 角色 |
---|---|---|
172.19.6.222 | cloud01 | manager |
172.19.6.223 | cloud02 | worker |
172.19.6.224 | cloud03 | worker |
3. 創建swarm集群
3.1創建集群的前提工作:
3.1.1開放swarm需求的埠:
在創建集群前,如果開啟了防火牆,請確認三台主機的防火牆能讓swarm需求的埠開放,需要打開主機之間的埠,以下埠必須可用。在某些系統上,這些埠默認為打開。
**2377**:TCP埠2377用於集群管理通信
**7946**:TCP和UDP埠7946用於節點之間的通信
**4789**:TCP和UDP埠4789用於覆蓋網路流量
如果您計劃使用加密(--opt加密)創建覆蓋網路,則還需要確保協議50(ESP)已打開。
可以直接禁用系統防火牆來讓這些埠通信不受限制,一般測試環境我們都會禁用防火牆
```
[root@localhost ~]# systemctl stop firewalld(立即生效)
[root@localhost ~]# systemctl disable firewalld(重啟生效)
```
3.1.2在三台主機節點上安裝好docker1.12或者更高的版本:
執行docker安裝: curl -fsSL https://get.docker.com/ | sh 查看docker最新版本的[安裝方法](https://github.com/docker/docker/releases)
3.2初始化swarm集群
3.2.1manager節點操作
執行docker swarm init --adverties0addr [manager節點的IP]
```docker
[root@cloud01 ~]# docker swarm init --advertise-addr 172.19.6.222
Swarm initialized: current node (ap235xkm64tj0al4gdzqbpwmi) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2qlhzljar0kw10ke623lvfy9mi9w3fgqgg8z9croosj9d7nl4n-b6789pdldcal2j5c4bs4uyl06 \
172.19.6.222:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
```
執行以上命令后,操作界面有對應的提示:
如果想要把worker節點加入到集群中執行:
```
docker swarm join \
--token SWMTKN-1-2qlhzljar0kw10ke623lvfy9mi9w3fgqgg8z9croosj9d7nl4n-b6789pdldcal2j5c4bs4uyl06 \
172.19.6.222:2377
```
3.2.2worker節點 cloud02、cloud03上執行加入到集群:
cloud02:
```
[root@cloud02 ~]# docker swarm join \
> --token SWMTKN-1-2qlhzljar0kw10ke623lvfy9mi9w3fgqgg8z9croosj9d7nl4n-b6789pdldcal2j5c4bs4uyl06 \
> 172.19.6.222:2377
This node joined a swarm as a worker.
```
cloud03:
```
[root@cloud03 ~]# docker swarm join \
> --token SWMTKN-1-2qlhzljar0kw10ke623lvfy9mi9w3fgqgg8z9croosj9d7nl4n-b6789pdldcal2j5c4bs4uyl06 \
> 172.19.6.222:2377
This node joined a swarm as a worker.
```
如果後續我們有新的主機被當做manager、worker節點想要加入到集群中來,但要不記得當時創建集群時的token,執行以下命令:
```docker
[root@cloud01 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2qlhzljar0kw10ke623lvfy9mi9w3fgqgg8z9croosj9d7nl4n-bpldk53d5yaxqa4gx0rbjjg86 \
172.19.6.222:2377
[root@cloud01 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2qlhzljar0kw10ke623lvfy9mi9w3fgqgg8z9croosj9d7nl4n-b6789pdldcal2j5c4bs4uyl06 \
172.19.6.222:2377
```
在另一個想要加入集群的manager、worker節點中執行,以上命令執行的結果;
在manager節點上執行查看節點命令:
執行命令docker node ls,查看節點信息。
```docker
[root@cloud01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4sy84tap36r6vglmt4y0f3kyb cloud02 Ready Active
ap235xkm64tj0al4gdzqbpwmi * cloud01 Ready Active Leader
don6u2knphk92ugdvfgdymu2t cloud03 Ready Active
```
參考:
[https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/](https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/)
[https://docs.docker.com/engine/swarm/swarm-tutorial/add-nodes/](https://docs.docker.com/engine/swarm/swarm-tutorial/add-nodes/)
4.集群的基本管理
4.1 列表節點列表
執行命令docker node ls,查看節點信息。
```docker
[root@cloud01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4sy84tap36r6vglmt4y0f3kyb cloud02 Ready Active
ap235xkm64tj0al4gdzqbpwmi * cloud01 Ready Active Leader
don6u2knphk92ugdvfgdymu2t cloud03 Ready Active
```
說明:
**AVAILABILITY列**:
顯示調度程序是否可以將任務分配給節點:
- Active 意味著調度程序可以將任務分配給節點。
- Pause 意味著調度程序不會將新任務分配給節點,但現有任務仍在運行。
- Drain 意味著調度程序不會向節點分配新任務。調度程序關閉所有現有任務並在可用節點上調度它們。
**MANAGER STATUS列**
顯示節點是屬於manager或者worker
- **沒有值** 表示不參與群管理的工作節點。
- **Leader** 意味著該節點是使得群的所有群管理和編排決策的主要管理器節點。
- **Reachable** 意味著節點是管理者節點正在參與Raft共識。如果領導節點不可用,則該節點有資格被選為新領導者。
- **Unavailable** 意味著節點是不能與其他管理器通信的管理器。如果管理器節點不可用,您應該將新的管理器節點加入群集,或者將工作器節點升級為管理器。
4.2 查看節點的詳細信息
您可以在管理器節點上運行docker node inspect<NODE-ID>來查看單個節點的詳細信息。 輸出默認為JSON格式,但您可以傳遞--pretty標誌以以可讀的yml格式列印結果。 例如:
```docker
[root@cloud01 ~]# docker node inspect self --pretty
ID:ap235xkm64tj0al4gdzqbpwmi
Hostname:cloud01
Joined at:2016-11-26 05:34:11.095107616 +0000 utc
Status:
State:Ready
Availability:Active
Manager Status:
Address:172.19.6.222:2377
Raft Status:Reachable
Leader:Yes
Platform:
Operating System:linux
Architecture:x86_64
Resources:
CPUs:4
Memory:7.912 GiB
Plugins:
Network:bridge, host, null, overlay
Volume:local
Engine Version:1.12.3
[root@cloud01 ~]#
```
self為當前manager節點
4.3 更新節點的可見性狀態
```docker
[root@cloud01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4sy84tap36r6vglmt4y0f3kyb cloud02 Ready Active
ap235xkm64tj0al4gdzqbpwmi * cloud01 Ready Active Leader
don6u2knphk92ugdvfgdymu2t cloud03 Ready Active
[root@cloud01 ~]# docker node update --availability Drain cloud02 (修改cloud02為不可用狀態)
cloud02
[root@cloud01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4sy84tap36r6vglmt4y0f3kyb cloud02 Ready Drain
ap235xkm64tj0al4gdzqbpwmi * cloud01 Ready Active Leader
don6u2knphk92ugdvfgdymu2t cloud03 Ready Active
[root@cloud01 ~]# docker node update --availability Active cloud02 (修改cloud02為可用狀態)
cloud02
[root@cloud01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4sy84tap36r6vglmt4y0f3kyb cloud02 Ready Active
ap235xkm64tj0al4gdzqbpwmi * cloud01 Ready Active Leader
don6u2knphk92ugdvfgdymu2t cloud03 Ready Active
```
如果想把manager節點,只做為調試的節點,不參於容器的運行,可以按照上面的方式 把manager節點設置為Drain.這樣所有的容器運行進,都不會在manager節點上創建或者運行容器,可以提高manager的高可用性。
4.4 添加或刪除標籤元數據
節點標籤提供了一種靈活的節點組織方法。 您還可以在服務約束中使用節點標籤。 在創建服務時應用約束,以限制調度程序為服務分配任務的節點。
在管理器節點上運行docker node update --label-add以將標籤元數據添加到節點。 --label-add標誌支持<key>或<key> = <value>對。
對要添加的每個節點標籤傳遞一次--label-add標誌:
```docker
[root@cloud01 ~]# docker node update --label-add manager --label-add manager=baz cloud01
cloud01
[root@cloud01 ~]# docker node inspect self --pretty
ID:ap235xkm64tj0al4gdzqbpwmi
Labels:
- manager = baz
Hostname:cloud01
Joined at:2016-11-26 05:34:11.095107616 +0000 utc
Status:
State:Ready
Availability:Active
Manager Status:
Address:172.19.6.222:2377
Raft Status:Reachable
Leader:Yes
Platform:
Operating System:linux
Architecture:x86_64
Resources:
CPUs:4
Memory:7.912 GiB
Plugins:
Network:bridge, host, null, overlay
Volume:local
Engine Version:1.12.3
```
使用docker節點更新為節點設置的標籤僅適用於群集內的節點實體。不要將它們與dockerd的docker守護程序標籤混淆。
4.5 升級或降級節點
您可以將工作程序節點提升為manager角色。這在管理器節點不可用或者您希望使管理器離線以進行維護時很有用。 類似地,您可以將管理器節點降級為worker角色。
無論您升級或降級節點,您應該始終在群中維護奇數個管理器節點。
要升級一個節點或一組節點,請從管理器節點運行docker node promote:
```docker
[root@cloud01 ~]# docker node promote cloud02 cloud03
Node cloud02 promoted to a manager in the swarm.
Node cloud03 promoted to a manager in the swarm.
[root@cloud01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4sy84tap36r6vglmt4y0f3kyb cloud02 Ready Active Reachable
ap235xkm64tj0al4gdzqbpwmi * cloud01 Ready Active Leader
don6u2knphk92ugdvfgdymu2t cloud03 Ready Active Reachable
```
要降級一個節點或一組節點,請從管理器節點運行docker node demote:
```docker
[root@cloud01 ~]# docker node demote cloud02 cloud03
Manager cloud02 demoted in the swarm.
Manager cloud03 demoted in the swarm.
[root@cloud01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4sy84tap36r6vglmt4y0f3kyb cloud02 Ready Active
ap235xkm64tj0al4gdzqbpwmi * cloud01 Ready Active Leader
don6u2knphk92ugdvfgdymu2t cloud03 Ready Active
```
4.6 退出docker swarm集群
首頁查看各節點的狀態,在manager節點上
```
[root@cloud01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4sy84tap36r6vglmt4y0f3kyb cloud02 Ready Active
ap235xkm64tj0al4gdzqbpwmi * cloud01 Ready Active Leader
don6u2knphk92ugdvfgdymu2t cloud03 Ready Active
```
在worker節點上運行如下命令
```
[root@cloud02 ~]# docker swarm leave
Node left the swarm.
[root@cloud02 ~]#
```
然後在manager節點上查看狀態:
```
[root@cloud01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4sy84tap36r6vglmt4y0f3kyb cloud02 Down Active
ap235xkm64tj0al4gdzqbpwmi * cloud01 Ready Active Leader
don6u2knphk92ugdvfgdymu2t cloud03 Ready Active
```
如果想把manager節點上已經退出集群的節點信息刪除,執行:
```
don6u2knphk92ugdvfgdymu2t cloud03 Ready Active
[root@cloud01 ~]# docker node rm cloud02
cloud02
[root@cloud01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ap235xkm64tj0al4gdzqbpwmi * cloud01 Ready Active Leader
don6u2knphk92ugdvfgdymu2t cloud03 Ready Active
```
參考:
[https://docs.docker.com/engine/swarm/manage-nodes/](https://docs.docker.com/engine/swarm/manage-nodes/)