Swarm、Swarmkit、Swarm Mode 对比

Docker1.12 的一个重大特性是提供了swarm mode。Docker 结合 swarm 从 1.6 开始支持容器编排。 Docker1.12 发布前几周,docker 还开源了 swarmkit,一个用于编排分布式系统的项目。 这三个项目让人颇为困惑,这篇博客中我和大家一起看下他们的相似之处以及区别。 我还会拿一个应用作为例子,来比较三者哪个更容易使用。

Docker swarm mode 和 swarm 存在本质区别,但是却使用了 swarm 这个易于混淆的名字。 我觉得 docker 社区应该考虑换个名字。另外一点同样增加了这个混淆,native swarm 会在 1.12 继续支持,从而提供兼容性。 这篇 Blog 中,我们使用 “Swarm” 表示老的 swarm 项目,“Swarmkit” 表示新开源的 swarmkit 项目,“SwarmNext” 表示 docker swarm mode。

Swarm, SwarmNext and Swarmkit

下边是 Swarm 和 SwarmNext 的对比:

Swarm SwarmNext
Separate from Docker Engine and can run as Container Integrated inside Docker engine
Needs external KV store like Consul, etcd No need of separate external KV store
Service model not available Service model is available. This provides features like scaling, rolling update, service discovery, load balancing and routing mesh
Communication not secure Both control and data plane is secure
Integrated with machine and compose Not yet integrated with machine and compose as of release 1.12. Will be integrated in the upcoming releases

下边是 SwarmKit 与 SwarmNext 的对比:

SwarmKit SwarmNext
Plumbing opensource project Swarmkit used within SwarmNext and tightly integrated with Docker Engine
Swarmkit needs to built and run separately Docker 1.12 comes integrated with SwarmNext
No service discovery, load balancing and routing mesh Service discovery, load balancing and routing mesh available
Use swarmctl CLI Use regular Docker CLI

Sample Application

下边是一个非常简单的应用。该应用时一个高可用的 web 投票服务,可以通过 client 访问。 client 的请求会被负载均衡到各个可用的 web 服务上。 应用使用 overlay 网络,我们将使用 Swarm、SwarmNext、SwarmKit 进行部署。

wechat

vote_web_system

前提条件

  • 本文中使用 docker-machine0.8.0-rc1,docker1.12.0-rc3.
  • “smakam/myubuntu” 容器使用的是 ubuntu 系统,加下一些比如 curl 的工具来展示负载均衡。

使用 Swarm 进行部署

步骤:

  • 创建 KV 存储。这里使用 consul。
  • 创建使用 consul 存储的 docker 实例。这里使用 docker-machine 创建。
  • 创建 overlay 网络。
  • 创建投票 web 系统的多实例以及 client 单实例。所有的 web 服务需要使用相同的网络别名,以便可以进行流量的负载均衡。

创建 KV 存储:

创建使用 KV 存储的 Docker swarm 实例:

创建 overlay 网络:

创建服务:

两个投票服务的容器,都是用相同网络别名 “vote”,从而可以被作为一个服务来访问。

从 client容器中访问 vote web 服务:

从上边可以看到,请求被均衡到了两个 vote web 服务。

使用 SwarmNext 进行部署

步骤如下:

  • 使用 docker machine 和 1.12 RC3 的 docker 创建两个 docker 实例。其中一个作为 master 节点,另外一个作为 worker 节点。
  • 创建 overlay 网络。
  • 基于 overlay 网络创建 2 个副本的 web 投票服务, 1 个副本的 client 服务。

创建两个 docker 实例:

设置 node1 为 master 节点:

node1 同时作为 woker 节点运行。
设置 node2 为 worker 节点:

查看云运行的 nodes:

创建 overlay 网络:

创建服务:

在这个例子中,本不需要把 port 映射到 host 上,但是我还是使用了。
使用 docker1.12 的 routing mesh 特性,将 8080 端口映射到了 node1 和 node2 上。
查看运行的服务:

从 client 容器连接 web 投票系统:

同样我们看到,client 的请求被均衡到了两个 web 服务容器。

使用 SwarmKit 进行部署

步骤:

  • 使用 docker-machine 创建 2 node 的 cluster。Swarm集 群虽然可以不适用 KV 存储。但是 overlay 网络需要 KV 存储。所以例子中我会使用 KV 存储。
  • 构建 swarmkit 并把二进制部署到 swarm 节点。
  • 创建 2 个 node 的 swarm 集群。
  • 创建 overlay 网络以及创建基于 overlay 网络的服务。

构建 swarmkit:

这里在 Go container 中进行 swarmkit 的编译。

创建基于 KV 存储的 Docker 实例:

拷贝 swarmkit 到 node 中:

创建 swarm cluster:

创建 overlay 网络和服务:

查看 2 node cluster:

通过 client 容器连接 web 投票系统:

因为 swarmkit 没有负载均衡、服务发现能力,我们使用容器的 IP 来进行访问。

总结

SwarmNext(docker的swarm mode)相对于之前的 swarm 是一个重大的改进。将服务对象引入 docker 中,可以很容易的实现诸如 scaling、rolling update、service discovery、load balance、routing mesh 的特性。 这样 swarm 可以在特性上更接近于 kubernetes。 在 1.12 release 中,docker 支持 SwarmNext 和 Swarm,之前将 swarm 用于生产环境的用户,可以进行升级。 SwarmNext 目前还不能与 compose、stoarge 插件很好的集成,但是应该会在之后的版本增加这些能力。 从长期来说,swarm 会被废弃,SwarmNext 会成为 docker 的唯一编排方式。 将 Swarmkit 开源,有利于 swarmkit 的独立开发,以及第三方基于 swarmkit 开发分布式应用的编排系统。

 

One thought on “Swarm、Swarmkit、Swarm Mode 对比

Leave a Reply

Your email address will not be published. Required fields are marked *