閱讀408 返回首頁    go 技術社區[雲棲]


阿裏雲容器服務支持SwarmMode

SwarmMode是Docker 1.12版開始推出的新功能,它將docker engine、swarm的集群管理和容器編排功能集成在一起,並新增了service概念及基於LVS的4層負載均衡功能(RoutingMesh)。

阿裏雲容器服務第一時間支持了SwarmMode,並在上麵做了很多功能擴充。這篇文章將介紹這些新功能以及它與舊Swarm集群的區別。

SwarmMode簡介

SwarmMode集群的架構圖如下圖所示:
swarmmode_1_

這個架構有以下一些特點:

  • 無任何外部依賴。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

  上一篇:go  mybatis簡單基礎配置
  下一篇:go  不負好時光——《Netty in Action》中文版《Netty實戰》翻譯手記