好消息:阿里云容器服务支持SwarmMode

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud

SwarmMode是Docker 1.12版开始推出的新功能,它将docker engine、swarm的集群管理和容器编排功能集成在一起,并新增了service概念及基于LVS的4层负载均衡功能(RoutingMesh)。

阿里云容器服务第一时间支持了SwarmMode,并在上面做了很多功能扩充。这篇文章将介绍这些新功能以及它与旧Swarm集群的区别。

SwarmMode简介

SwarmMode集群的架构图如下图所示:

好消息:阿里云容器服务支持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:

扩展功能

下面的表格列举了原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:

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**。

相关推荐