xcbeyond|瘋狂源自夢想,技術成就輝煌
1、前言
相信Docker技術大家都有所瞭解,單個Docker能發揮的作用畢竟有限,也不便於管理,所以Docker得組叢集來使用才能發揮強大的技術優勢。既然要組叢集那就涉及諸如Docker的資源排程、管理等等一系列問題。目前涉及Docker叢集的三個主要的技術無外乎Swarm、Kubernetes、Mesos三種。本文主要來看看Swarm。
2、什麼是Swarm
Swarm這個名稱特別貼切。在Wiki中解釋道:
Swarm behavior是指動物的群集行為。比如我們常見的蜂群,魚群,秋天往南飛的雁群都可以稱作Swarm behavior。
Swarm正是這樣,通過把多個Docker Engine聚集在一起,形成一個大的docker-engine,對外提供容器的叢集服務。同時這個叢集對外提供Swarm API,使用者可以像使用Docker Engine一樣使用Docker叢集。
Swarm 特點:
對外以Docker API介面呈現,這樣帶來的好處是,如果現有系統使用Docker Engine,則可以平滑將Docker Engine切到Swarm上,無需改動現有系統。
Swarm對使用者來說,之前使用Docker的經驗可以繼承過來。非常容易上手,學習成本和二次開發成本都比較低。同時Swarm本身專注於Docker叢集管理,非常輕量,佔用資源也非常少。 *“Batteries included but swappable”,簡單說,就是外掛化機制,Swarm中的各個模組都抽象出了API,可以根據自己一些特點進行定製實現。
Swarm自身對Docker命令引數支援的比較完善,Swarm目前與Docker是同步釋出的。Docker的新功能,都會第一時間在Swarm中體現。
Docker自誕生以來,其容器特性以及映象特性給DevOps愛好者帶來了諸多方便。然而在很長的一段時間內,Docker只能在單host上執行,其跨host的部署、執行與管理能力頗受外界詬病。跨host能力的薄弱,直接導致Docker容器與host的緊耦合,這種情況下,Docker容器的靈活性很難令人滿意,容器的遷移、分組等都成為很難實現的功能點。
Swarm是Docker公司在2014年12月初新發布的容器管理工具。和Swarm一起釋出的Docker管理工具還有Machine以及Compose。
Swarm是一套較為簡單的工具,用以管理Docker叢集,使得Docker叢集暴露給使用者時相當於一個虛擬的整體。Swarm使用標準的Docker API介面作為其前端訪問入口,換言之,各種形式的Docker Client(dockerclient in go, docker_py, docker等)均可以直接與Swarm通訊,Swarm幾乎全部用Go語言來完成開發。
3、Swarm相關概念
(1)Swarm
叢集的管理和編排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化時啟動 swarm 模式或者加入已存在的 swarm。
(2)Node
一個節點(node)是已加入到 swarm 的 Docker 引擎的例項 當部署應用到叢集,你將會提交服務定義到管理節點,接著 Manager管理節點排程任務到 worker 節點,manager 節點還執行維護叢集的狀態的編排和群集管理功能,worker 節點接收並執行來自manager 節點的任務。通常,manager 節點也可以是 worker 節點,worker 節點會報告當前狀態給 manager 節點
(3)服務(Service)
服務是要在 worker 節點上要執行任務的定義,它在工作者節點上執行,當你建立服務的時,你需要指定容器映象
(4)任務(Task)
任務是在 docekr 容器中執行的命令,Manager 節點根據指定數量的任務副本分配任務給 worker 節點。
docker swarm:叢集管理,子命令有 init, join, leave, update。(docker swarm –help 檢視幫助)
docker service:服務建立,子命令有 create, inspect, update, remove, tasks。(docker service–help 檢視幫助)
docker node:節點管理,子命令有 accept, promote, demote, inspect, update, tasks, ls, rm。(docker node –help 檢視幫助)node 是加入到 swarm 叢集中的一個 docker 引擎實體,可以在一臺物理機上執行多個 node,node 分為:
manager nodes,也就是管理節點
worker nodes,也就是工作節點
1)manager node 管理節點:執行叢集的管理功能,維護叢集的狀態,選舉一個 leader 節點去執行排程任務。
2)worker node 工作節點:接收和執行任務。參與容器叢集負載排程,僅用於承載 task。
3)service 服務:一個服務是工作節點上執行任務的定義。建立一個服務,指定了容器所使用的映象和容器執行的命令。
service 是執行在 worker nodes 上的 task 的描述,service 的描述包括使用哪個 docker 映象,以及在使用該映象的容器中執行什麼命令。
4)task 任務:一個任務包含了一個容器及其執行的命令。task 是 service 的執行實體,task 啟動 docker 容器並在容器中執行任務。
4、Swarm叢集
4.1 環境準備
- CentOS 7(3.10.0-327.10.1.el7.x86_64)
- Docker 17.05.0-ce
4.2 環境搭建
節點規劃如下:
一共4個節點(1個master、3個slave(worker)),通過四臺虛擬機器搭建。
4.2.1 Docker環境安裝
4.2.2 Docker Swarm叢集
(1)在Master節點上安裝Swarm
初始化swarm
執行命令 docker swarm init --advertise-addr 192.168.99.100
[[email protected] ~]# 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引數表示其它swarm中的worker節點使用此ip地址與manager聯絡。命令的輸出包含了其它節點如何加入叢集的命令。
上面命令執行後,該Master節點自動加入到swarm叢集。這時會建立一個叢集token,獲取全球唯一的 token,作為叢集唯一標識。後續將其他節點加入叢集都會用到這個token值。
(2)新增叢集節點
在其他三個slave節點上分別執行以下命令:
[[email protected] ~]# docker swarm join --token SWMTKN-1-5vqq9j2bwq5rllsubg49cs16440v2ixkngvf25e5688i86c8qf-eawa9w8wf2m5mu9e6ovmhjuyy 192.168.99.100:2377
This node joined a swarm as a worker.
以上就表明節點新增成功。
如果加入節點時,出現錯誤"Error response from daemon: rpc error: code = 14 desc = grpc: the connection is unavailable",則在Master節點上關閉防火牆後,重新再slave節點上新增即可。
(3)檢視叢集節點
docker node list