1. 程式人生 > >Docker Manager for Docker Swarm deploy

Docker Manager for Docker Swarm deploy

物理 部分 集群 傳播 調用 結束 --help 簡單的 工作

一、Swarm概述

Swarm是Docker公司在2014年12月初發布的一套較為簡單的工具,用來管理Docker集群,它將一群Docker宿主機變成一個單一的,虛擬的主機。Swarm使用標準的Docker API接口作為其前端訪問入口,換言之,各種形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接與Swarm通信。Swarm幾乎全部用Go語言來完成開發,Swarm0.2版本增加了一個新的策略來調度集群中的容器,使得在可用的節點上傳播它們,以及支持更多的Docker命令以及集群驅動。Swarm deamon只是一個調度器(Scheduler)加路由器(router),Swarm自己不運行容器,它只是接受docker客戶端發送過來的請求,調度適合的節點來運行容器,這意味著,即使Swarm由於某些原因掛掉了,集群中的節點也會照常運行,當Swarm重新恢復運行之後,它會收集重建集群信息。

Docker的Swarm(集群)模式,集成很多工具和特性,比如:跨主機上快速部署服務,服務的快速擴展,集群的管理整合到docker引擎,這意味著可以不可以不使用第三方管理工具。分散設計,聲明式的服務模型,可擴展,狀態協調處理,多主機網絡,分布式的服務發現,負載均衡,滾動更新,安全(通信的加密)等等,下面就來認識下Swarm(對於Swarm管理的詳細操作可以參考:https://www.centos.bz/tag/swarm/page/3/)

二、Swarm架構

Swarm作為一個管理Docker集群的工具,首先需要將其部署起來,可以單獨將Swarm部署於一個節點,另外,自然需要一個Docker集群,集群上每一個節點均安裝有Docker,具體的Swarm架構圖如下:

技術分享圖片

Swarm架構中最主要的處理部分自然是Swarm節點,Swarm管理的對象自然是Docker Cluster,Docker Cluster由多個Docker Node組成,而負責給Swarm發送請求的是Docker Client。

Swarm關鍵概念

1)Swarm
集群的管理和編排是使用嵌入到docker引擎的SwarmKit,可以在docker初始化時啟動swarm模式或者加入已存在的swarm
 
2)Node
一個節點(node)是已加入到swarm的Docker引擎的實例 當部署應用到集群,你將會提交服務定義到管理節點,接著Manager
管理節點調度任務到worker節點,manager節點還執行維護集群的狀態的編排和群集管理功能,worker節點接收並執行來自
manager節點的任務。通常,manager節點也可以是worker節點,worker節點會報告當前狀態給manager節點
 
3)服務(Service)
服務是要在worker節點上要執行任務的定義,它在工作者節點上執行,當你創建服務的時,你需要指定容器鏡像
 
4)任務(Task)
任務是在docekr容器中執行的命令,Manager節點根據指定數量的任務副本分配任務給worker節點
 
--------------------------------------------------------------------------------------------------------
docker swarm:集群管理,子命令有init, join, leave, update。(docker swarm --help查看幫助)
docker service:服務創建,子命令有create, inspect, update, remove, tasks。(docker service--help查看幫助)
docker node:節點管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm。(docker node --help查看幫助)
  
node是加入到swarm集群中的一個docker引擎實體,可以在一臺物理機上運行多個node,node分為:
manager nodes,也就是管理節點
worker nodes,也就是工作節點
  
1)manager node管理節點:執行集群的管理功能,維護集群的狀態,選舉一個leader節點去執行調度任務。
2)worker node工作節點:接收和執行任務。參與容器集群負載調度,僅用於承載task。
3)service服務:一個服務是工作節點上執行任務的定義。創建一個服務,指定了容器所使用的鏡像和容器運行的命令。
   service是運行在worker nodes上的task的描述,service的描述包括使用哪個docker 鏡像,以及在使用該鏡像的容器中執行什麽命令。
4)task任務:一個任務包含了一個容器及其運行的命令。task是service的執行實體,task啟動docker容器並在容器中執行任務。

Swarm工作方式

1)Node

技術分享圖片

2)Service(服務, 任務, 容器)

技術分享圖片

3)任務與調度

技術分享圖片

4)服務副本與全局服務

技術分享圖片

Swarm調度策略

Swarm在scheduler節點(leader節點)運行容器的時候,會根據指定的策略來計算最適合運行容器的節點,目前支持的策略有:spread, binpack, random.
1)Random
顧名思義,就是隨機選擇一個Node來運行容器,一般用作調試用,spread和binpack策略會根據各個節點的可用的CPU, RAM以及正在運行的容器的數量來計算應該運行容器的節點。
 
2)Spread
在同等條件下,Spread策略會選擇運行容器最少的那臺節點來運行新的容器,binpack策略會選擇運行容器最集中的那臺機器來運行新的節點。
使用Spread策略會使得容器會均衡的分布在集群中的各個節點上運行,一旦一個節點掛掉了只會損失少部分的容器。
 
3)Binpack
Binpack策略最大化的避免容器碎片化,就是說binpack策略盡可能的把還未使用的節點留給需要更大空間的容器運行,盡可能的把容器運行在
一個節點上面。

Swarm Cluster模式的特性

1)批量創建服務
建立容器之前先創建一個overlay的網絡,用來保證在不同主機上的容器網絡互通的網絡模式
  
2)強大的集群的容錯性
當容器副本中的其中某一個或某幾個節點宕機後,cluster會根據自己的服務註冊發現機制,以及之前設定的值--replicas n,
在集群中剩余的空閑節點上,重新拉起容器副本。整個副本遷移的過程無需人工幹預,遷移後原本的集群的load balance依舊好使!
不難看出,docker service其實不僅僅是批量啟動服務這麽簡單,而是在集群中定義了一種狀態。Cluster會持續檢測服務的健康狀態
並維護集群的高可用性。
  
3)服務節點的可擴展性
Swarm Cluster不光只是提供了優秀的高可用性,同時也提供了節點彈性擴展或縮減的功能。當容器組想動態擴展時,只需通過scale
參數即可復制出新的副本出來。
  
仔細觀察的話,可以發現所有擴展出來的容器副本都run在原先的節點下面,如果有需求想在每臺節點上都run一個相同的副本,方法
其實很簡單,只需要在命令中將"--replicas n"更換成"--mode=global"即可!
 
復制服務(--replicas n)
將一系列復制任務分發至各節點當中,具體取決於您所需要的設置狀態,例如“--replicas 3”。
 
全局服務(--mode=global)
適用於集群內全部可用節點上的服務任務,例如“--mode global”。如果大家在 Swarm 集群中設有 7 臺 Docker 節點,則全部節點之上都將存在對應容器。
  
4. 調度機制
所謂的調度其主要功能是cluster的server端去選擇在哪個服務器節點上創建並啟動一個容器實例的動作。它是由一個裝箱算法和過濾器
組合而成。每次通過過濾器(constraint)啟動容器的時候,swarm cluster 都會調用調度機制篩選出匹配約束條件的服務器,並在這上面運行容器。
  
------------------Swarm cluster的創建過程包含以下三個步驟----------------------
1)發現Docker集群中的各個節點,收集節點狀態、角色信息,並監視節點狀態的變化
2)初始化內部調度(scheduler)模塊
3)創建並啟動API監聽服務模塊
  
一旦創建好這個cluster,就可以用命令docker service批量對集群內的容器進行操作,非常方便!
  
在啟動容器後,docker 會根據當前每個swarm節點的負載判斷,在負載最優的節點運行這個task任務,用"docker service ls" 和"docker service ps + taskID"
可以看到任務運行在哪個節點上。容器啟動後,有時需要等待一段時間才能完成容器創建。

三、Swarm集群部署

基礎環境


10.211.55.12      swarm的manager節點      manager-node   
10.211.55.13      swarm的node節點         swarm node1
10.211.55.14      swarm的node節點         swarm node2


[root@swarm-manager ~]# docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:08:18 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:10:42 2018
  OS/Arch:          linux/amd64
  Experimental:     false
  
  
  
  [root@swarm-node1 ~]# docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:08:18 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:10:42 2018
  OS/Arch:          linux/amd64
  Experimental:     false
  
  
  [root@swarm-node2 ~]# docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:08:18 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:10:42 2018
  OS/Arch:          linux/amd64
  Experimental:     false

創建swarm master

[root@swarm-manager ~]# docker swarm init -advertise-addr=10.211.55.12
Swarm initialized: current node (zbfrleu13zsr311u995zb81a9) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-52n4mwxf0w9c0xujtgbgbm0o9cv8zq9d3yld7njtd67irxh6mq-8jqgyabu7fr0e90dm5q29c5ee 10.211.55.12:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.


ps: 執行命令後,則該機器自動加入swarm集群,這時會創建一個集群token,獲取全球唯一的togen,作為集群的唯一標識。後續將其他節點加入集群都會用到token值,-advertise-addr參數表示其它swarm中的worker節點使用此ip地址與manager聯系。命令的輸出包含了其它節點如何加入集群的命令。



溫馨提示:
如果再次執行上面啟動swarm集群的命令,會報錯說這個節點已經在集群中了
Error response from daemon: This node is already part of a swarm. Use "docker swarm leave" to leave this swarm and join another one.
 
解決辦法:
[root@swarm-manager ~]# docker swarm leave --help           //查看幫助
[root@swarm-manager ~]# docker swarm leave --force

添加節點到swarm集群

[root@swarm-node1 ~]# docker swarm join --token SWMTKN-1-52n4mwxf0w9c0xujtgbgbm0o9cv8zq9d3yld7njtd67irxh6mq-8jqgyabu7fr0e90dm5q29c5ee 10.211.55.12:2377

[root@swarm-node2 ~]# docker swarm join --token SWMTKN-1-52n4mwxf0w9c0xujtgbgbm0o9cv8zq9d3yld7njtd67irxh6mq-8jqgyabu7fr0e90dm5q29c5ee 10.211.55.12:2377


# 查看集群節點狀態
[root@swarm-manager ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
zbfrleu13zsr311u995zb81a9 *   swarm-manager       Ready               Active              Leader              18.06.0-ce
2svx72upyh3buyynvdwa6jnhh     swarm-node1         Ready               Active                                  18.06.0-ce
75f5gdzwv0tv9kyt2p97pbntd     swarm-node2         Ready               Active                                  18.06.0-ce


溫馨提示:更改節點的availablity狀態
swarm集群中node的availability狀態可以為 active或者drain,其中:
active狀態下,node可以接受來自manager節點的任務分派;
drain狀態下,node節點會結束task,且不再接受來自manager節點的任務分派(也就是下線節點)。
 
[root@manager-node ~]# docker node update --availability drain node1    //將node1節點下線。如果要刪除node1節點,命令是"docker node rm --force node1"
[root@swarm-manager ~]# docker node ls
ID                           HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
1gi8utvhu4rxy8oxar2g7h6gr *  manager-node  Ready   Active        Leader
ei53e7o7jf0g36329r3szu4fi    node1         Ready   drain      
f1obgtudnykg51xzyj5fs1aev    node2         Ready   Active
 
如上,當node1的狀態改為drain後,那麽該節點就不會接受task任務分發,就算之前已經接受的任務也會轉移到別的節點上。
 
再次修改為active狀態(及將下線的節點再次上線)
[root@swarm-manager~]# docker node update --availability drain node1

Docker Manager for Docker Swarm deploy