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的对比:
下边是SwarmKit与SwarmNext的对比:
Sample Application
下边是一个非常简单的应用。该应用时一个高可用的web投票服务,可以通过client访问。
client的请求会被负载均衡到各个可用的web服务上。
应用使用overlay网络,我们将使用Swarm、SwarmNext、SwarmKit进行部署。
前提条件
本文中使用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开发分布式应用的编排系统。
- Swarm、SwarmKit、Swarm mode 对比
- 【转】Swarm、SwarmKit、Swarm mode 对比-【概念区分非常重要】
- Swarm, Swarmkit 和 Swarm模式的比较
- Swarm, Swarmkit 和 Swarm模式的比较
- swarm
- docker swarm mode 学习
- Docker Swarm Mode
- Docker swarm mode
- Swarm mode(Docker第二代swarm)实验
- Kubernetes& swarm对比
- swarm kubernetes mesos对比
- Docker Swarm 和Swarm mode 是两个概念!!
- 搭建Docker Swarm集群实战(三)(swarm mode)
- Swarm mode环境模型-小结篇
- 在AWS上设置Docker Swarm Mode
- docker-docker swarm mode 的技术性总结
- docker swarm笔记-Swam mode教程
- 部署Swarm - Deploy Swarm
- NOI2001 食物链(并茶几)
- 55. Jump Game
- 7.1 Fiddler4工作环境介绍
- Data truncation: Data too long for column 'contents_o' at row 1 报错原因
- 191. Number of 1 Bits
- Swarm、SwarmKit、Swarm mode 对比
- JAVA导出数据到excel中大数据量的解决方法
- java之在命令环境中操作Mysql数据库
- 55. Jump Game
- C语言实现简单的socket实例
- 23种java设计模式之观察者模式
- Objective-C中的作用域详解
- jvm jdk jre区别
- 如何用img标签显示图片的某一部分