Docker在上周的DockerCon技术大会上发布了1.12版核心产品Docker Engine,最大的新特性是Docker Swarm已经被整合到了Docker Engine里面而不再是一个单独的工具了,这样就可以更容易的把多个Docker主机组合成一整个规模更大可靠性更高的逻辑单元。Docker的掌舵者 Adrian Mouat相信这种新的集群模式可以大大增强Docker在相关领域的竞争力。
把Docker Swarm整合进Docker Engine是一个重大改进,但它也只是一个附加功能,你可以只在需要的时候才使用它。你可以用和以前一样的方式来安装、运行和升级Docker 1.12,而且它也对已有的容器镜像和工具向后兼容。
在一台主机上运行Docker和在使用Docker Compose来部署应用程序方法都是和以前一样的。你甚至可以在已有的Docker Swarm上使用1.12版Docker Engine。除非你是显式地使用新引擎来创建一个集群,否则运行时行为仍然和以前版本一样。
旧的Docker Swarm产品是以套件形式提供的,本身没有什么核心功能。Docker Swarm进程在各个节点上做为容器运行,而且还需要许多其他技术来辅助它,比如用Consul或etcd来做服务发现,用Nginx做负载均衡等。集群 实际上要先运行一堆基础设施容器,然后才能运行你自己的应用程序容器。
搭建起一个旧的集群也并非易事,因为在你创建集群之前服务发现组件就要就位,可是之后你又想让它作为集群的一个部分来运行,所以你什么事情都没开始干就要先解决一个“先有鸡还是先有蛋”的问题。Jacob Blain Christen在他的文章“Toward a Production-Ready Docker Swarm Cluster with Consul”里面很好的解释了这个问题。
在新的集群模式下用一个’init’命令即可创建集群,用’join’命令可以把工作者加入集群。创建和加入集群的命令一般一两秒钟就可以执行完毕。Mouat说“与把Kubernetes或Mesos集群启动起来相比,启动Docker集群就是一闪的事”。
节点之间的通信安全由传输层安全协议(TLS)来保证。为了安装简便,Docker 1.12会在创建集群时生成自签名证书,当然也可以换成你从自己的证书颁发机构获得的证书。这些证书在节点内部通信时会被用到,但所有对外的服务仍然是和以前一样使用你原来的证书。
Nigel Poulton在DockerCon大会上分享了旧版和1.12版启动集群的对比图:
Docker建议在一个L3子网内运行所有集群节点,但根据你自己的实际情况,也可以把节点划分到不同的子网里,把运行对外服务容器的节点和内部节点隔离开来。
这种隔离方法也许你已经在独立的生产集群上使用过了。我在贴子“在Azure上部署Docker生产集群”中已经结合微软的云服务写了文档。
集群的自我认知能力是最重大的改变。集群中的每个节点都可以连接其他任何一个节点,并且可以把请求路由到它需要去的地方。你再也不必自己运行负载均衡器并把它与动态服务发现代理结合起来了,对这点以前的方式通常是Nginx加Interlock。
如果一个节点收到了一条处理不了的请求,它就会找到运行了可以处理这条请求的容器的节点,并把这条请求路由过去。这个过程对用户是透明的,他们最终只能收到一条响应消息,完全不知道在集群内部是否发生过消息转发。
这个Docker叫作“路由网”的功能支持外部负载均衡。你可以在集群前面放一个对外的负载均衡器,并把它配置成所有服务的唯一入口,它就会把流入的消息在集群内部随意分发,然后收到了消息的节点就会智能的把它处理不了的消息转发到合适的地方去。Docker核心工程组解释路由网用到了Linux的核心功能,即一个已经在Linux内核中存在了至少15年的负载均衡功能。
路由网和调度器的组合可以保证即使有节点发生故障也不会造成服务中断。负载均衡器不会把任何请求发送到出故障的节点上。如果因为故障导致服务所需要的最小副本数达不到要求,调度器就会自动在别的节点上运行起新的副本来。
Docker Swarm仍然是原生的Docker集群的名字,但在1.12版的集群模式下它也是Docker Egnine的一个组成部分,不再是一个单独的产品了。你可以获得服务发现服务,可以给集群配置多个管理者来增强可靠性,以及配置满足你需要的足够数量的 工作者。
在这个版本里,Docker Engine脱离了其他Docker产品跑到前面了。现在还不能用Docker Machine来部署一个新式的集群,也不能用Docker Compose来部署服务。但Docker社区总是动作很快,所以期待它们也很快被整合进来吧。
查看英文原文:Docker Swarm Is Dead. Long Live Docker Swarm.