Swarm的进化和大规模应用 以阿里云为例

架构

阿里云 云计算架构1932

图2 Swarm Mode架构

它的架构比Swarm更简单一些,首先就是它没有任何的外部依赖,只要你装 Docker Engine,它就可以构成一个容器集群,DockerDaemon本身会兼Engine、Manager、Agent三职。Managers之间通过RAFT协议组成分布式强一致性KV Store,Manager与Worker的Daemon不通信。

同时,它也是有高可用设计的,Manager数量需要大于等于3才可以实现高可用,它也是一主多热备,另外也可以动态添加/删除Manager,如果有的机器宕机或者挂掉了,你不需要把这个机器再恢复起来,很多系统对Manager控制器的机器是有依赖的。如果一旦挂掉了你只能把它修好之后再上来,但是这个是不需要的,你可以任意在里面编程。这样他会通过RAFT协议把原来集群状态信息统一到Manager上去,这样有实现了高可用。

Swarm Mode API

在刚才Swarm的API之上,多提供了两类的API:

集群管理类:

1.init、join、leave

2.token

服务类:

1.get/list

2.create、delete、update

3.inspect、ps

同时,Swarm的API有两个特点,它分两类,一类是像Swarm、Service、Network类,只有Manager能处理的。还有一类容器、镜像、数据卷类,所有节点都能处理。另外它的API还是高度兼容旧的API,你可以拿低版本的去访问Swarm mode的集群。

Service

我们来看一下Swarm Service的概念,它提供了三级的概念:

1.Service:相同功能的一组容器

2.Task:任务调度单元,由Manager生成,同步至Worker

3.Container:Task落地

另外,还提供Rolling Update功能。

在Swarm mode里面Service分为两类,一类是有Replicated Service,一类是Global Service。

Replicated Service:

1.用户指定副本数

2.Reconciled:自动确保副本数

3.constraint

node.id node.hostname:

1.node.role

2.node.labels engine.labels

Global Service:

1.每个节点有且仅有一个容器

2.添加加点时自动扩展

3.可附加constraint

网络模型方面,支持overlay网络,同一网络内,服务名、容器名可解析;一个服务一个网络;服务发现支持不同服务可加入同一个网络。

Routing Mesh

下面我们看一下Swarm自带的负载均衡,它取的名字叫做Routing Mesh,Service自带的负载均衡是基于LVS,主要有两种模式,

VIP模式:每个服务一个VIP,通过LVS实现;服务名解析至VIP;

DNS模式:服务名解析至容器IP,RoundRobin方式。另外,服务发生变化时,自动调整后端。

总结一下Swarm Mode的产品,第一个它是无任何依赖,可以安装Engine+一个命令,无中心架构。第二个它可以部署高可用服务,你可以在集群这边进行访问的,比如说你的容器只布在了三台机器,这个集群所有的机器都可以访问到这个服务,这样的话就很容易做成高可用的。再一个Secure by default,自带证书颁发、更新功能,Manager与Worker之间通过SSL连接。

当然它也有一些不足的地方,第一个只有Service级抽象,Stack级抽象仍无API,另外,部署有状态服务比较复杂。第二,Service API有很多容器特性不支持,如host network、host pid、privileged等。还有一个缺点,它无法自举,是需要手工init的。

Swarm在阿里内部的应用

上面介绍了Docker Swarm的产品相关的东西。下面我就来介绍一下Swarm在阿里内部的应用,这个也是大家更关心的一个地方,有几个方面。第一是阿里内部的容器化,可能大家都知道,阿里内部有一支非常强大的运维团队,除非查问题的时候,一般开发人员是不接触现代的机器的,所有的应用部署、升级这些都是运维人员来做的。强大的运维团队也导致了一些问题,它的应用的部署和升级往往是很个性化的,可能这个运维人员他在支持这个应用的时候,通过写一些脚本或者用一些工具,实现业务的部署的自动化,而另外的运维人员运用另外的工具和另外的脚本,导致了很多应用的升级部署不是一个标准化的方式。

这样的话,比如说这个人员他转岗了,新来的人首先要去熟悉那个部署的工具,这个运维任务比较大,所以应该是从去年、前年阿里内部开始推容器化,由Swarm来统一管理我们的集群,应用的话就是容器化之后,由Swarm去统一做部署,这样的话就会形成一个跟业务无关的统一的部署平台。运维人员不再去关心应用如何地去部署,他只要关心把这个应用部署上去就可以了,所有的应用都是一样的方式,即使有新的人接替他学起来也非常地方便。