408
技術社區[雲棲]
阿裏雲容器服務支持SwarmMode
SwarmMode是Docker 1.12版開始推出的新功能,它將docker engine、swarm的集群管理和容器編排功能集成在一起,並新增了service概念及基於LVS的4層負載均衡功能(RoutingMesh)。
阿裏雲容器服務第一時間支持了SwarmMode,並在上麵做了很多功能擴充。這篇文章將介紹這些新功能以及它與舊Swarm集群的區別。
SwarmMode簡介
這個架構有以下一些特點:
- 無任何外部依賴。Manager之間通過Raft協議,組成一個分布式KVStore,替代了原Swarm中的etcd。
- Daemon身兼Engine、Manager、Agent三職
- Manager不直接發送命令給Worker的Daemon,隻是同步Task信息
- 高可用架構,隻需將Manager設置成>=3的奇數個
由於沒有外部依賴,SwarmMode集群的部署非常簡單,隻需要安裝好DockerEngine,再設置好節點角色即可。
阿裏雲容器服務上的SwarmMode集群
集群部署
部署SwarmMode集群跟部署之前的Swarm集群沒有什麼差別,用戶隻需要在創建時選擇集群類型即可,容器服務會自動完成docker安裝、集群角色設置的工作。需要注意的是,為了實現高可用,集群至少需要有3個節點。
我們會默認設置3個Manager。當節點加入集群時,如果當前Manager數量不足3個,節點會被設置為Manager,否則會被設置為Worker。
應用部署
我們支持通過編排模板和交互界麵兩種方式來部署應用。
編排模板(compose)
SwarmMode集群隻支持compose v3和compose v3.1,其語法格式參見https://docs.docker.com/compose/compose-file/ 。
下麵是一個簡單的示例
version: "3.1"
services:
nginx:
image: nginx:latest
deploy:
mode: global
ports:
- 80:80
擴展功能
下麵的表格列舉了原Swarm集群上的擴展功能在SwarmMode集群上的支持情況。
功能 | Swarm集群 | SwarmMode集群 |
---|---|---|
服務的健康檢查 | aliyun.probe標簽 | compose中的healthcheck一節。該功能由DockerEngine原生提供 |
滾動更新(rolling update) | aliyun.rolling_updates標簽 | compose中的update_config一節。該功能由SwarmMode原生提供,可設置更新的批量、間隔時間、失敗後的動作等。 |
服務依賴 | aliyun.depends標簽 | compose中的depends_on一節。服務會按照依賴關係順序啟動,默認等待3分鍾,如果服務3分鍾後依然沒有達到運行狀態,會忽略並繼續部署其他服務,但最終部署結果是失敗。 |
服務的容器數量 | aliyun.scale標簽 | compose中的replicas一節。該功能對應於SwarmMode的Replicated Service,當容器故障時,會自動創建新容器,始終保證replicas等於指定的數量。 |
全局服務 | aliyun.global標簽 | compose中的mode一節。該功能對應於SwarmMode的Global Service,當新節點加入集群裏,會自動創建相應容器。 |
負載均衡 | aliyun.routing、aliyun.lb標簽 | 參考下麵的負載均衡一節。 |
日誌 | aliyun.log_標簽 | 沒有變化。 |
數據卷 | compose的volumes一節 | 使用方法沒有變化,但使用本地數據卷時,如果主機文件夾不存在,不會自動創建,需要用戶手工創建。 |
監控與自動擴縮容 | aliyun.auto_scaling、aliyun.reschedule標簽 | 沒有變化。 |
外部服務 | compose的external一節 | 不支持。 |
容器重新調度 | 環境變量中的reschedule:on-node-failure | 默認提供,不需要設置。 |
高可用性調度 | 環境變量中的availability:az | 暫時不支持。 |
路由與負載均衡
原Swarm集群支持7層(aliyun.routing)和4層(aliyun.lb)路由,SwarmMode集群也支持這兩種模式,且語法不變,如下麵的編排模板所示:
version: "3"
services:
nginx:
image: nginx:latest
ports:
- 80
deploy:
mode: replicated
replicas: 1
labels:
aliyun.routing.port_80: web
aliyun.lb.port_80: tcp://slbtest:8080
aliyun.routing.port_80: web
:將web子域轉發到nginx服務的80端口。這種模式下,不需要暴露容器端口到主機,即如果隻用這種方式,上麵模板中的ports一節可以省略。aliyun.lb.port_80: tcp://slbtest:8080
:將slbtest這個SLB實例的8080端口綁定到nginx服務的80端口。老的Swarm集群,要求用戶手工將slbtest的後端綁定一個端口,但SwarmMode中不需要,我們會自動根據用戶暴露的端口,自動修改slb的後端。另外,SwarmMode中,**同一集群的不同服務可以共享同一個SLB**。
最後更新:2017-05-12 11:30:47