看 Docker Swarm 如何做集群
看 Docker Swarm 如何做集群
本文所有服務均采用docker容器化方式部署
當前環境
- Mac OS 10.11.x
- Docker >= 1.12
目錄
- 基本概念
- 安裝
- 使用場景
- 分配策略
- 高可用
- 總結
基本概念
技術說明
- Docker Engine:作為 Docker 鏡像構建與容器化啟動的工作引擎;
- Docker Machine:安裝與管理 Docker Engine 的工具;
- Docker Swarm:是 Docker 自1.12后自帶的集群技術,將多個獨立的 Docker Engine 利用 Swarm 技術進行集群化管理;
原理
簡單來講,Docker 集群的實現是通過 Docker Machine 在多主機或虛擬機上創建多個 Docker Engine,在利用 Docker Swarm 以某個 Engine 作為集群的初始管理節點,其他 Engine 以管理或工作節點的方式加入,形成完成的集群環境。
安裝(本次演示在單臺 Mac 上進行)
創建 Docker Engine
使用 docker-machine 命令創建 docker 工作引擎。
參數說明:
-d:設置 Docker Engine 驅動(Mac 下默認是 virtualbox)
--virtualbox-boot2docker-url:設置驅動地址( 如果默認驅動下載很慢,可以更改國內的下載路徑 )
下面創建4個引擎,1個集群管理者和3個工作者: ??
docker-machine create -d virtualbox manager1 docker-machine create -d virtualbox worker1 docker-machine create -d virtualbox worker2 docker-machine create -d virtualbox worker3
查看運行結果(docker-machine ls):
初始化集群
- 連接 manager1
eval $(docker-machine env manager1)
查看運行結果:
- 創建 swarm
docker swarm init --advertise-addr 192.168.99.100
參數說明:
--advertise-addr:設置管理節點的對外IP,供集群中的其他節點訪問;
命令說明:
該命令會創建一個新的 swarm,以當前節點作為 swarm 的管理節點。同時生成2個 token (manager/worker)供其他節點加入使用( 查詢token命令 docker swarm join-token )。
查看集群節點狀況(docker node ls):
加入工作節點
連接 worker1
eval $(docker-machine env worker1)
加入 swarm
docker swarm join \ --token WORKER_TOKEN \ 192.168.99.100:2377</pre>
同上,將其余兩個以 worker 身份加入
查看集群節點狀況( 僅可在管理節點下查看 ):
移除節點
如果想要移除集群下的某個節點,可在該節點環境下,執行該命令:
$ eval $(docker-machine env worker3)當前環境在 worker3 上
docker swarm leave</pre>
查看集群節點狀況
重新加入集群
加入 swarm
docker swarm join \ --token WORKER_TOKEN \ 192.168.99.100:2377</pre>
查看集群節點狀況
移除無效節點
docker node rm INVALID_ID查看集群節點狀況
使用場景
關于 swarm 集群的搭建已經完成了,接下來就是啟動服務。啟動服務的模式分為:replicated 和 global。
replicated(默認方式):先在一個 node 節點上創建一個服務,通過復制的方式進行擴展,這中間涉及擴展的策略。
global:在每個 node 節點上都會創建一個服務,像 Registrator(自動注冊服務) 就很適合用這種方式執行。
以 gobal 方式創建 nginx 服務
docker service create --mode=global --name=web nginx查看服務啟動情況(每個節點都起了一個 web 服務):
以 replicated 方式創建 nginx 服務
- 創建一個 nginx 服務
docker service create --name=web nginx
查看服務啟動情況:
- 將服務依次擴展至5個
docker service scale nginx=2
查看服務啟動情況
docker service scale nginx=3
查看服務啟動情況
docker service scale nginx=4
查看服務啟動情況
docker service scale nginx=5
查看服務啟動情況
擴展分配策略
從服務的擴展可以看出,其中存在了一定的分配策略。這里采用的是默認的 Spread 策略。下面簡單描述下最常用的2種 Spread 與 BinPack。
-
Spread:依據節點個數進行平均分配。
- 優勢:在容器使用資源相對一致的情況下,整體資源使用在每個節點上做了平均的分配;
- 不足:若每個容器所占資源相差很大,那么節點的資源使用率將存在明顯差異,導致資源使用的浪費;
-
BinPack:盡可能的使用一個節點的資源,在節點資源不足的情況下,更換使用節點。
- 優勢:節點資源能得到充分使用;
- 不足:單節點的負重較高,而且每個節點性能未必都一樣,可能會分重CPU或重磁盤讀寫等。 </ul> </li> </ul>
-
manager 節點的可用性:我們可以設置多個 manager 節點。當 primary manager 掛掉后,secondary managers 中會選舉一個作為 primary manager,以保證服務的高可用性。
-
服務高可用:服務如果啟動失敗,或中途異常中止,會進行自動重啟。保障了擴展服務的可用性。
真實場景還是得依據具體的業務來合理使用分配策略。特殊情況,還需要搭配使用 filters、affinity 來具體選擇節點。
高可用
服務的啟動都是通過 manager 節點將啟動服務分發給 worker 節點,而且服務的管理也是由manager節點來控制的。
總結
本文主要講述了如何使用 Docker Swarm 來做 docker 的集群管理。其中包括了集群部署、服務的啟動、擴展,以及常用的分配策略。
swarm 在 docker 1.12開始被集成進了docker中。相比之前版本,以 docker run swarm create 啟動的方式,現節點與節點之間是通過內置的 DNS 發現機制進行通信,使用更為便捷。
最后也提一下,使用 k8s 做容器集群管理的也在多數。這里不討論兩者的好壞,如果還沒用 k8s 的可以考慮使用 swarm,畢竟目前是docker 內置的服務。
來自:https://github.com/jasonGeng88/blog/blob/master/201704/docker_swarm.md