Docker Swarm介紹及搭建集群
作者:xcbeyond
瘋狂源自夢(mèng)想,技術(shù)成就輝煌!微信公眾號(hào):《程序猿技術(shù)大咖》號(hào)主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對(duì)于Java、微服務(wù)、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。
1、前言
相信Docker技術(shù)大家都有所了解,單個(gè)Docker能發(fā)揮的作用畢竟有限,也不便于管理,所以Docker得組集群來使用才能發(fā)揮強(qiáng)大的技術(shù)優(yōu)勢。既然要組集群那就涉及諸如Docker的資源調(diào)度、管理等等一系列問題。目前涉及Docker集群的三個(gè)主要的技術(shù)無外乎Swarm、Kubernetes、Mesos三種。本文主要來看看Swarm。
2、什么是Swarm
Swarm這個(gè)名稱特別貼切。在Wiki中解釋道:
Swarm behavior是指動(dòng)物的群集行為。比如我們常見的蜂群,魚群,秋天往南飛的雁群都可以稱作Swarm behavior。
Swarm正是這樣,通過把多個(gè)Docker Engine聚集在一起,形成一個(gè)大的docker-engine,對(duì)外提供容器的集群服務(wù)。同時(shí)這個(gè)集群對(duì)外提供Swarm API,用戶可以像使用Docker Engine一樣使用Docker集群。
Swarm 特點(diǎn):
對(duì)外以Docker API接口呈現(xiàn),這樣帶來的好處是,如果現(xiàn)有系統(tǒng)使用Docker Engine,則可以平滑將Docker Engine切到Swarm上,無需改動(dòng)現(xiàn)有系統(tǒng)。
Swarm對(duì)用戶來說,之前使用Docker的經(jīng)驗(yàn)可以繼承過來。非常容易上手,學(xué)習(xí)成本和二次開發(fā)成本都比較低。同時(shí)Swarm本身專注于Docker集群管理,非常輕量,占用資源也非常少。 *“Batteries included but swappable”,簡單說,就是插件化機(jī)制,Swarm中的各個(gè)模塊都抽象出了API,可以根據(jù)自己一些特點(diǎn)進(jìn)行定制實(shí)現(xiàn)。
Swarm自身對(duì)Docker命令參數(shù)支持的比較完善,Swarm目前與Docker是同步發(fā)布的。Docker的新功能,都會(huì)第一時(shí)間在Swarm中體現(xiàn)。
Docker自誕生以來,其容器特性以及鏡像特性給DevOps愛好者帶來了諸多方便。然而在很長的一段時(shí)間內(nèi),Docker只能在單host上運(yùn)行,其跨host的部署、運(yùn)行與管理能力頗受外界詬病??鏷ost能力的薄弱,直接導(dǎo)致Docker容器與host的緊耦合,這種情況下,Docker容器的靈活性很難令人滿意,容器的遷移、分組等都成為很難實(shí)現(xiàn)的功能點(diǎn)。
Swarm是Docker公司在2014年12月初新發(fā)布的容器管理工具。和Swarm一起發(fā)布的Docker管理工具還有Machine以及Compose。
Swarm是一套較為簡單的工具,用以管理Docker集群,使得Docker集群暴露給用戶時(shí)相當(dāng)于一個(gè)虛擬的整體。Swarm使用標(biāo)準(zhǔn)的Docker API接口作為其前端訪問入口,換言之,各種形式的Docker Client(dockerclient in go, docker_py, docker等)均可以直接與Swarm通信,Swarm幾乎全部用Go語言來完成開發(fā)。
3、Swarm相關(guān)概念
(1)Swarm
集群的管理和編排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化時(shí)啟動(dòng) swarm 模式或者加入已存在的 swarm。
(2)Node
一個(gè)節(jié)點(diǎn)(node)是已加入到 swarm 的 Docker 引擎的實(shí)例 當(dāng)部署應(yīng)用到集群,你將會(huì)提交服務(wù)定義到管理節(jié)點(diǎn),接著 Manager管理節(jié)點(diǎn)調(diào)度任務(wù)到 worker 節(jié)點(diǎn),manager 節(jié)點(diǎn)還執(zhí)行維護(hù)集群的狀態(tài)的編排和群集管理功能,worker 節(jié)點(diǎn)接收并執(zhí)行來自manager 節(jié)點(diǎn)的任務(wù)。通常,manager 節(jié)點(diǎn)也可以是 worker 節(jié)點(diǎn),worker 節(jié)點(diǎn)會(huì)報(bào)告當(dāng)前狀態(tài)給 manager 節(jié)點(diǎn)
(3)服務(wù)(Service)
服務(wù)是要在 worker 節(jié)點(diǎn)上要執(zhí)行任務(wù)的定義,它在工作者節(jié)點(diǎn)上執(zhí)行,當(dāng)你創(chuàng)建服務(wù)的時(shí),你需要指定容器鏡像
(4)任務(wù)(Task)
任務(wù)是在 docekr 容器中執(zhí)行的命令,Manager 節(jié)點(diǎn)根據(jù)指定數(shù)量的任務(wù)副本分配任務(wù)給 worker 節(jié)點(diǎn)。
docker swarm:集群管理,子命令有 init, join, leave, update。(docker swarm –help 查看幫助)
docker service:服務(wù)創(chuàng)建,子命令有 create, inspect, update, remove, tasks。(docker service–help 查看幫助)
docker node:節(jié)點(diǎn)管理,子命令有 accept, promote, demote, inspect, update, tasks, ls, rm。(docker node –help 查看幫助)node 是加入到 swarm 集群中的一個(gè) docker 引擎實(shí)體,可以在一臺(tái)物理機(jī)上運(yùn)行多個(gè) node,node 分為:
manager nodes,也就是管理節(jié)點(diǎn)
worker nodes,也就是工作節(jié)點(diǎn)
1)manager node 管理節(jié)點(diǎn):執(zhí)行集群的管理功能,維護(hù)集群的狀態(tài),選舉一個(gè) leader 節(jié)點(diǎn)去執(zhí)行調(diào)度任務(wù)。
2)worker node 工作節(jié)點(diǎn):接收和執(zhí)行任務(wù)。參與容器集群負(fù)載調(diào)度,僅用于承載 task。
3)service 服務(wù):一個(gè)服務(wù)是工作節(jié)點(diǎn)上執(zhí)行任務(wù)的定義。創(chuàng)建一個(gè)服務(wù),指定了容器所使用的鏡像和容器運(yùn)行的命令。
service 是運(yùn)行在 worker nodes 上的 task 的描述,service 的描述包括使用哪個(gè) docker 鏡像,以及在使用該鏡像的容器中執(zhí)行什么命令。
4)task 任務(wù):一個(gè)任務(wù)包含了一個(gè)容器及其運(yùn)行的命令。task 是 service 的執(zhí)行實(shí)體,task 啟動(dòng) docker 容器并在容器中執(zhí)行任務(wù)。
4、Swarm集群
4.1 環(huán)境準(zhǔn)備
CentOS 7(3.10.0-327.10.1.el7.x86_64)
Docker 17.05.0-ce
4.2 環(huán)境搭建
節(jié)點(diǎn)規(guī)劃如下:
一共4個(gè)節(jié)點(diǎn)(1個(gè)master、3個(gè)slave(worker)),通過四臺(tái)虛擬機(jī)搭建。
4.2.1 Docker環(huán)境安裝
請(qǐng)參考之前寫的文章CentOS7 下Docker安裝、啟動(dòng),這里不再做具體說明。
4.2.2 Docker Swarm集群
(1)在Master節(jié)點(diǎn)上安裝Swarm
初始化swarm
執(zhí)行命令 docker swarm init --advertise-addr 192.168.99.100
[docker@master ~]# docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (zeisswb5lm92gj8rsng9pxzxd) is now a manager.
To add a worker to this swarm, run the following command:
docker
swarm join --token
SWMTKN-1-043bhcd0voztnsui79l1rg0pyu4xq1q5x188jeyvppplt2rvnk-6diwivwlc14aipcji90tms4ua
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
其中,--advertise-addr參數(shù)表示其它swarm中的worker節(jié)點(diǎn)使用此ip地址與manager聯(lián)系。命令的輸出包含了其它節(jié)點(diǎn)如何加入集群的命令。
上面命令執(zhí)行后,該Master節(jié)點(diǎn)自動(dòng)加入到swarm集群。這時(shí)會(huì)創(chuàng)建一個(gè)集群token,獲取全球唯一的 token,作為集群唯一標(biāo)識(shí)。后續(xù)將其他節(jié)點(diǎn)加入集群都會(huì)用到這個(gè)token值。
(2)添加集群節(jié)點(diǎn)
在其他三個(gè)slave節(jié)點(diǎn)上分別執(zhí)行以下命令:
[docker@slave1
~]# docker swarm join --token
SWMTKN-1-5vqq9j2bwq5rllsubg49cs16440v2ixkngvf25e5688i86c8qf-eawa9w8wf2m5mu9e6ovmhjuyy
192.168.99.100:2377
This node joined a swarm as a worker.
以上就表明節(jié)點(diǎn)添加成功。
如果加入節(jié)點(diǎn)時(shí),出現(xiàn)錯(cuò)誤"Error response from daemon: rpc error: code = 14 desc = grpc: the connection is unavailable",則在Master節(jié)點(diǎn)上關(guān)閉防火墻后,重新再slave節(jié)點(diǎn)上添加即可。
(3)查看集群節(jié)點(diǎn)
docker node list