Docker容器叢集管理之Swarm
阿新 • • 發佈:2018-12-24
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版本了