概述
在我的《Docker Swarm集群初探》一文中,我們實際體驗了Docker Swarm容器集群技術的魅力,與《Kubernetes實踐錄》一文中提到的Kubernetes集群技術相比,Docker Swarm沒有Kubernetes顯得那么厚重,因此可以認為是更加輕量級的容器集群技術,這也就意味著上手更加方便快捷,使用起來也要省事很多。作為Docker集群技術三(或“四”)架馬車之一的Docker Swarm,它從一開始便是Docker官方的“親兒子”,發展到現在也經歷了很多階段和迭代。作者在學習的過程中也了解了一點其發展歷史,發現有幾個概念還是挺容易混淆的,因此撰寫成文,是梳理,也是總結。
注: 本文原載于 My Personal Blog:, CodeSheep · 程序羊 !
初出茅廬之:經典Swarm
早在2014年底,Docker公司就設計了容器集群的方案組合:Machine + Swarm + Compose。其中Machine主要用于快速創建Docker運行環境,其支持在創建出來的節點上自動部署Swarm,此時的Swarm我們稱為 “經典Swarm”,它是一款整合跨節點網絡的集群式容器服務,其利用Docker守護進程的API,將多節點的計算資源進行匯總,并提供兼容Docker的運行API,使用者只需要在執行Docker命令工具時,用--host參數將目標設置為Swarm服務的IP和端口,即可操作整個容器集群。
當然此時的Swarm局限性較大,比如:
- 沒有副本和負載均衡的概念,這導致服務無法高可用
- 當然也更不存在什么服務網絡管理和跨節點數據存儲這些東西
- 沒有服務模型:集群中服務間關系和啟動順序編排也很復雜
于是就有了下面的SwarmKit的誕生。
發展壯大之:SwarmKit
在2016年2月,Docker公司開始了一個名叫 SwarmKit 的項目。而恰在Docker 1.12 RC之前的一段時間,Docker 發布了 Swarmkit,這是一個獨立的、開源的容器編排項目。SwarmKit不同于一開始的經典Swarm,它從一開始就重新設計了一套獨立的API和模型體系,并且采用獨立的客戶端命令行工具:swarmctl
和上面的經典Swarm模型相比,它加入了如下特性:
- 重新設計的一套獨立的API和模型體系
- 使用了自己的CLI(
swarmd
命令負責管理,swarmctl
命令用于控制) - 節點管理、服務模型更加自然,提供編排和調度服務
- 將過去Swarm依賴的外部集群一致性存儲組件Etcd的核心部分內置化
然而此時的SwarmKit并沒有提供諸如服務發現、負載均衡和路由等功能。盡管如此,SwarmKit其實已經是我們今天廣泛使用的Docker Swarm集群技術的基石。
厚積薄發之:Swarm Mode
Swarm Mode則更進一步,它在Docker 1.12版本開始為大家所周知,一個 docker swarm
命令 紅遍大江南北,這個所謂的Swarm Mode其實就是我們今天所廣泛使用的Docker Swarm集群技術。
然而Swarm Mode并不是一個全新的東西,也并不是一個全新的模式,而是站在SwarmKit的巨人肩膀上發展起來的,是Docker中的一組與集群相關功能的統稱而已。Docker將SwarmKit的核心模塊內嵌于Docker的后臺服務之中,通過不同的命令允許使用者同時以“本節點”和“本集群”這兩種視角來操作整個集群,增加了集群的管理、節點的管理、服務的管理和編排等等一系列高級特性,就像在我的《Docker Swarm集群初探》一文中體驗的那樣。
因此總結一下Swarm Mode就是:
- 基于Swarmkit編寫
- 支持服務模型以及服務發現、路由和負載均衡等新功能
- 使用Docker原生態的CLI命令
- 集成到了Docker engine中(強大的
docker swarm
命令)
對比總結
如果用一張圖來表示 Docker、經典Swarm、SwarmKit、Swarm Mode 四個概念之間的關系,則大致可以如下圖所示:
正如圖中所示,SwarmKit 和 Swarm Mode 重疊的部分表示的是相應的項目之間存在代碼層面的互相引用或組件形式的依賴,其實 Swarm Mode 所創建的集群本質上并無異于 SwarmKit 集群。
更細致一點,我們從SwarmKit和Swarm Mode二者在一些常用命令操作上的比較來看看二者的區別和聯系:
1. 創建集群
- SwarmKit方式:
swarmd
- SwarmMode方式:
docker swarm init
2. 往集群中添加節點
- SwarmKit方式:
swarmd --hostname worknode --join-addr [IP:端口] --join-token [Token]
- SwarmMode方式:
docker swarm join --token [token] [IP:端口]
3. 查看集群節點信息
- SwarmKit方式:
swarmctl node ls
- SwarmMode方式:
docker node ls
4. 創建服務
- SwarmKit方式:
swarmctl service create --name [服務名] --image [鏡像名]
- SwarmMode方式:
docker service create --name [服務名] [鏡像名]
5. 服務擴容
- SwarmKit方式:
swarmctl service update [服務名] --replicas [副本數目]
- SwarmMode方式:
docker service scale [服務名]=[副本數目]
6. 服務(鏡像)升級
- SwarmKit方式:
swarmctl service update [服務名] --image [鏡像名]
- SwarmMode方式:
docker service update [服務名] --image [鏡像名]
從命令行操作來看,Swarm Mode其實非常類似于SwarmKit,然而前者更加靠近 Docker 原生態圈的命令,因此更加人性化。
后記
由于能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!