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 存储:

docker-machine create -d virtualbox mh-keystore
eval "$(docker-machine env mh-keystore)"
docker run -d \
   -p "8500:8500" \
   -h "consul" \
 progrium/consul -server -bootstrap

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

docker-machine create \
-d virtualbox \
--swarm --swarm-master \
--swarm-discovery="consul://$(docker-machine ip mh-keystore):8500" \
--engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
--engine-opt="cluster-advertise=eth1:2376" \
mhs-demo0

docker-machine create -d virtualbox \
    --swarm \
    --swarm-discovery="consul://$(docker-machine ip mh-keystore):8500" \
--engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
--engine-opt="cluster-advertise=eth1:2376" \  
mhs-demo1

创建 overlay 网络:

eval $(docker-machine env --swarm mhs-demo0)
docker network create --driver overlay overlay1

创建服务:

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

docker run -d --name=vote1 --net=overlay1 --net-alias=vote instavote/vote
docker run -d --name=vote2 --net=overlay1 --net-alias=vote instavote/vote
docker run -ti --name client --net=overlay1 smakam/myubuntu:v4 bash

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

root@abb7ec6c67fc:/# curl vote | grep "container ID" 
          Processed by container ID a9c05cd4ee15
root@abb7ec6c67fc:/# curl -i vote | grep "container ID" 
          Processed by container ID ce94f38fc958

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

使用 SwarmNext 进行部署

步骤如下:

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

创建两个 docker 实例:

docker-machine create -d virtualbox node1
docker-machine create -d virtualbox node2

设置 node1 为 master 节点:

docker swarm init --listen-addr 192.168.99.100:2377

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

docker swarm join 192.168.99.100:2377

查看云运行的 nodes:

$ docker node ls
ID                           HOSTNAME MEMBERSHIP STATUS  AVAILABILITY MANAGER STATUS
b7jhf7zddv2w2evze1bz44ukx *  node1    Accepted   Ready   Active       Leader
ca4jgzcnyz70ry4h5enh701fv    node2    Accepted   Ready   Active

创建 overlay 网络:

docker network create --driver overlay overlay1

创建服务:

docker service create --replicas 1 --name client --network overlay1 smakam/myubuntu:v4 ping docker.com
docker service create --name vote --network overlay1 --replicas 2 -p 8080:80 instavote/vote

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

$ docker service ls
ID           NAME   REPLICAS IMAGE              COMMAND
2rm1svgfxzzw client 1/1      smakam/myubuntu:v4 ping docker.com
af6lg0cq66bl vote   2/2      instavote/vote

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

# curl vote | grep "container ID" 
      Processed by container ID c831f88b217f
# curl vote | grep "container ID" 
      Processed by container ID fe4cc375291b

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

使用 SwarmKit 进行部署

步骤:

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

构建 swarmkit:

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

git clone https://github.com/docker/swarmkit.git
eval $(docker-machine env swarm-01)
docker run -it --name swarmkitbuilder -v `pwd`/swarmkit:/go/src/github.com/docker/swarmkit golang:1.6 bash
cd /go/src/github.com/docker/swarmkit
make binaries

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

docker-machine create \
-d virtualbox \
--engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
--engine-opt="cluster-advertise=eth1:2376" \
swarm-01
docker-machine create -d virtualbox \
--engine-opt="cluster-store=consul://$(docker-machine ip mh-keystore):8500" \
--engine-opt="cluster-advertise=eth1:2376" \
swarm-02

拷贝 swarmkit 到 node 中:

docker-machine scp bin/swarmd swarm-01:/tmp
docker-machine scp bin/swarmctl swarm-01:/tmp
docker-machine ssh swarm-01 sudo cp /tmp/swarmd /tmp/swarmctl /usr/local/bin/
docker-machine scp bin/swarmd swarm-02:/tmp
docker-machine scp bin/swarmctl swarm-02:/tmp
docker-machine ssh swarm-02 sudo cp /tmp/swarmd /tmp/swarmctl /usr/local/bin/

创建 swarm cluster:

Master:
docker-machine ssh swarm-01
swarmd -d /tmp/swarm-01 \
--listen-control-api /tmp/swarm-01/swarm.sock \
--listen-remote-api 192.168.99.101:4242 \
--hostname swarm-01 &

Worker:
swarmd -d /tmp/swarm-02 \
--hostname swarm-02 \
--listen-remote-api 192.168.99.102:4242 \
--join-addr 192.168.99.101:4242 &

创建 overlay 网络和服务:

swarmctl network create --driver overlay --name overlay1
swarmctl service create --name vote --network overlay1 --replicas 2 --image instavote/vote
swarmctl service create --name client --network overlay1 --image smakam/myubuntu:v4 --command ping,docker.com

查看 2 node cluster:

export SWARM_SOCKET=/tmp/swarm-01/swarm.sock
swarmctl node ls

ID                        Name     Membership  Status  Availability  Manager Status
5uh132h0acqebetsom1z1nntm swarm-01 ACCEPTED    READY   ACTIVE        REACHABLE *
5z8z6gq36maryzrsy0cmk7f51          ACCEPTED    UNKNOWN ACTIVE

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

# curl 10.0.0.3 | grep "container ID" 
            Processed by container ID 78a3e9b06b7f
# curl 10.0.0.4 | grep "container ID" 
            Processed by container ID 04e02b1731a0

因为 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 开发分布式应用的编排系统。

 

3 thoughts on “Swarm、Swarmkit、Swarm Mode 对比

Comments are closed.