Swarm、SwarmKit、Swarm mode 对比

来源:互联网 发布:seo和sem哪个好点 编辑:程序博客网 时间:2024/06/05 21:52

..
声明:
本博客欢迎转发,但请保留原作者信息!
博客地址:http://blog.csdn.net/halcyonbaby
新浪微博:@寻觅神迹
原文地址: https://sreeninet.wordpress.com/2016/07/14/comparing-swarm-swarmkit-and-swarm-mode/

本文系个人翻译,错漏之处请见谅。

====================================

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进行部署。

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/votedocker run -d --name=vote2 --net=overlay1 --net-alias=vote instavote/votedocker run -ti --name client --net=overlay1 smakam/myubuntu:v4 bash

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

root@abb7ec6c67fc:/# curl vote  | grep "container ID"          Processed by container ID a9c05cd4ee15root@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 node1docker-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 lsID                           HOSTNAME  MEMBERSHIP  STATUS  AVAILABILITY  MANAGER STATUSb7jhf7zddv2w2evze1bz44ukx *  node1     Accepted    Ready   Active        Leaderca4jgzcnyz70ry4h5enh701fv    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.comdocker service create --name vote --network overlay1 --replicas 2 -p 8080:80 instavote/vote

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

查看运行的服务:

$ docker service lsID            NAME    REPLICAS  IMAGE               COMMAND2rm1svgfxzzw  client  1/1       smakam/myubuntu:v4  ping docker.comaf6lg0cq66bl  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创建2node的cluster。Swarm集群虽然可以不适用KV存储。但是overlay网络需要KV存储。所以例子中我会使用KV存储。
+ 构建swarmkit并把二进制部署到swarm节点。
+ 创建2个node的swarm集群。
+ 创建overlay网络以及创建基于overlay网络的服务。

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

git clone https://github.com/docker/swarmkit.giteval $(docker-machine env swarm-01)docker run -it --name swarmkitbuilder -v `pwd`/swarmkit:/go/src/github.com/docker/swarmkit golang:1.6 bashcd /go/src/github.com/docker/swarmkitmake 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-01docker-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:/tmpdocker-machine scp bin/swarmctl swarm-01:/tmpdocker-machine ssh swarm-01 sudo cp /tmp/swarmd /tmp/swarmctl /usr/local/bin/docker-machine scp bin/swarmd swarm-02:/tmpdocker-machine scp bin/swarmctl swarm-02:/tmpdocker-machine ssh swarm-02 sudo cp /tmp/swarmd /tmp/swarmctl /usr/local/bin/

创建swarm cluster:

Master:docker-machine ssh swarm-01swarmd -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 overlay1swarmctl service create --name vote --network overlay1 --replicas 2 --image instavote/voteswarmctl service create --name client --network overlay1 --image smakam/myubuntu:v4 --command ping,docker.com

查看2node cluster:

export SWARM_SOCKET=/tmp/swarm-01/swarm.sockswarmctl node lsID                         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.12release中,docker支持SwarmNext和Swarm,之前将swarm用于生产环境的用户,可以进行升级。
SwarmNext目前还不能与compose、stoarge插件很好的集成,但是应该会在之后的版本增加这些能力。
从长期来说,swarm会被废弃,SwarmNext会成为docker的唯一编排方式。
将Swarmkit开源,有利于swarmkit的独立开发,以及第三方基于swarmkit开发分布式应用的编排系统。

0 0