..
聲明:
本博客歡迎轉發,但請保留原作者信息!
博客地址: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進行部署。
前提條件
本文中使用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創建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.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
查看2node 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.12release中,docker支持SwarmNext和Swarm,之前將swarm用於生產環境的用戶,可以進行升級。
SwarmNext目前還不能與compose、stoarge插件很好的集成,但是應該會在之後的版本增加這些能力。
從長期來說,swarm會被廢棄,SwarmNext會成爲docker的唯一編排方式。
將Swarmkit開源,有利於swarmkit的獨立開發,以及第三方基於swarmkit開發分佈式應用的編排系統。