1. 程式人生 > >Docker容器叢集管理之Swarm

Docker容器叢集管理之Swarm

  Docker容器叢集管理主流方案

Swarm
Docker公司自研發的叢集管理系統。
Kubernetes
Google開源的一個容器叢集管理系統,用於自動化部署、擴充套件和管理容器應用。也稱為K8S
Mesos
Mesos是一個叢集資源排程系統,對叢集中的資源進行分配和管理。Marathon是執行在Mesos之上的一個服務管理框架,可管理容器生命週期。
Docker容器叢集管理主流方案
講

   Swarm、Kubernetes和Mesos簡單比較:

複雜性
Swarm使用標準Docker介面,集成於Docker Engine,內建Overlay網路、服務發現、負載均衡,很容易上手,學習成本低。
K8S成熟且複雜,自己的管理體系,服務發現,負載均衡等功能,學習成本高。
Mesos是一個成熟分散式資源管理框架,一個通用的叢集管理系統。
功能
Swarm支援Docker Compose v3來實現服務編排。
K8S強大的功能,有著一套整體容器解決方案,使用起來更輕鬆。
社群活躍度
K8S社群相比Swarm和Mesos活躍度都高。

   Swarm介紹

叢集部署及節點管理
服務管理
使用原生Overlay網路
資料持久化
服務發現與負載均衡
高可用性
配置檔案儲存
應用實戰
-手動建立和服務編排部署LNMP網站平臺

   Swarm是什麼

Swarm是Docker公司自研發的容器叢集管理系統,Swarm在早期是作為一個獨立服務存在,在Docker Engine v1.12中集成了Swarm的叢集管理和編排功能。可以通過初始化Swarm或加入現有Swarm來啟用Docker引擎的Swarm模式。
Docker Engine CLI和API包括了管理Swarm節點命令,比如新增、刪除節點,以及在Swarm中部署和編排服務。
也增加了服務棧(Stack)、服務(Service)、任務(Task)概念。

   Swarm兩種角色

Manager:接收客戶端服務定義,將任務傳送到worker節點;維護叢集期望狀態和叢集管理功能及Leader選舉。預設情況下manager節點也會執行任務,也可以配置只做管理任務。
Worker:接收並執行從管理節點分配的任務,並報告任務當前狀態,以便管理節點維護每個服務期望狀態。

 

  Swarm的特點

1. Docker Engine整合叢集管理
使用Docker Engine CLI 建立一個Docker Engine的Swarm模式,在叢集中部署應用程式服務。
2. 去中心化設計
Swarm角色分為Manager和Worker節點,Manager節點故障不影響應用使用。
3. 擴容縮容
可以宣告每個服務執行的容器數量,通過新增或刪除容器數自動調整期望的狀態。
4. 期望狀態協調
Swarm Manager節點不斷監視叢集狀態,並調整當前狀態與期望狀態之間的差異。例如,設定一個服務執行10個副本容器,如果兩個副本的伺服器節點崩潰,Manager將建立兩個新的副本替代崩潰的副本。並將新的副本分配到可用的worker節點。
5. 多主機網路
可以為服務指定overlay網路。當初始化或更新應用程式時,Swarm manager會自動為overlay網路上的容器分配IP地址。
6. 服務發現
Swarm manager節點為叢集中的每個服務分配唯一的DNS記錄和負載均衡VIP。可以通過Swarm內建的DNS伺服器查詢叢集中每個執行的容器。
7. 負載均衡
實現服務副本負載均衡,提供入口訪問。也可以將服務入口暴露給外部負載均衡器再次負載均衡。
8. 安全傳輸
Swarm中的每個節點使用TLS相互驗證和加密,確保安全的其他節點通訊。
9. 滾動更新
升級時,逐步將應用服務更新到節點,如果出現問題,可以將任務回滾到先前版本。

   叢集部署及節點管理

  使用swarm前提

Docker版本1.12+
叢集節點之間保證TCP 2377、TCP/UDP 7946和UDP 4789埠通訊

   節點規劃

作業系統ubuntu18.04
管理節點:192.168.56.128
工作節點:192.168.56.129
工作節點:192.168.56.130

   檢視當前docker版本

 

  管理節點初始化swarm

docker swarm init --advertise-addr 192.168.56.128

 

  工作節點加入swarm

 docker swarm join --token SWMTKN-1-2jxm5hdcno1m06v1eqzsrsrcqg1hjsvkotdojo87n67lasngkf-2ick8vihgd6jmkgpoe09wra2s 192.168.56.128:2377

 

  管理節點檢視

 

  檢視節點資訊

 docker node inspect docker2

 

  檢視執行任務數

docker node ps

   

  服務管理

  建立服務 建立一個服務副本數為1 名字為hello

docker service create --replicas 1 --name hello busybox

   檢視

  MODE是replicated會根據預設排程演算法分配節點

  REPLICAS副本數 右邊是設定多少 左邊是啟動多少

   檢視啟動狀態多次失敗,因為busybox是一個基礎映象沒有持續執行

  加一個持續執行的任務

docker service update  --args "ping www.baidu.com" hello

 

  過濾出只在執行的

docker service ps -f "desired-state=running" hello

 

  以上資訊可以檢視到是工作在docker1這個節點上面的

  對該服務進行擴容

docker service scale hello=3

 

  指定docker1只作為管理節點

docker node update --availability drain docker1

   作為manage的節點沒有容器了 會把副本複製到其他節點管理節點的docker刪除

  

  滾動更新服務

 docker service create \
> --replicas 3 \
> --name redis \
> --update-delay 10s \
> redis:3.0.6

 

  更新

docker service update --image redis:3.0.7 redis

   顯示更新狀態以及老版本資訊

  檢視剛剛設定的更新策略

docker service inspect redis

 

  

  建立服務時設定更新策略

 docker service create --name my_web --replicas 10 --update-delay 10s --update-parallelism 2 --update-failure-action continue nginx:1.12

   --update-parallelism最大並行數量

   --update-failure-action continue更新失敗後繼續

  服務更新

docker service update --image nginx:1.13 my_web

 

 

  建立服務時設定回滾策略 建立前刪除docker service rm my_web

docker service create \
--name my_web \
--replicas 10 \
--rollback-parallelism 2 \
--rollback-monitor 20s \
--rollback-max-failure-ratio .2 \
nginx:1.12

   先更新

docker service update --image nginx:1.13 my_web

   手動回滾

docker service update --rollback my_web

   又回滾到1.12版本了