[docker]Swarm、SwarmKit、Swarm mode 對比

..
聲明:
本博客歡迎轉發,但請保留原作者信息!
博客地址: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/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開發分佈式應用的編排系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章