Docker Swarm(一)集群部署


 

一、機器環境

  • 機器規划
172.16.0.89      swarm的manager節點      manager-node   
172.16.0.90 swarm的node節點      node1

機器版本(均是:CentOS Linux release 7.7.1908)

  • 設置主機名
在manager節點上
[root@manager-node ~]# hostnamectl --static set-hostname manager-node

在node1節點上

[root@node1 ~]# hostnamectl --static set-hostname node1

在2台機器上都要設置hosts,均執行如下命令:

vim /etc/hosts

......
172.16.0.89 manager-node
172.16.0.90 node1
  • 設置防火牆
關閉2台機器上的防火牆。如果開啟防火牆,則需要在所有節點的防火牆上依次放行2377 /tcp (管理端口)、7946 /udp (節點間通信端口)、4789 /udp (overlay 網絡端口)端口。
[root@manager-node ~]# systemctl disable firewalld.service     --禁止firewall開機啟動
[root@manager-node ~]# systemctl stop firewalld.service        --停止firewall
  • 安裝docker

在2台機器上分別安裝docker,這里使用的是【18.09.9】版本

 

 

二、創建集群

  • 創建Swarm

在 manager-node 節點上執行以下命令進行創建:

docker swarm init --advertise-addr 172.16.0.89

上面命令執行后,該機器自動加入到swarm集群。這個會創建一個集群token,獲取全球唯一的 token,作為集群唯一標識。后續將其他節點加入集群都會用到這個token值(要保存好)。

其中,--advertise-addr參數表示其它swarm中的worker節點使用此ip地址與manager聯系。命令的輸出包含了其它節點如何加入集群的命令:

docker swarm join --token SWMTKN-1-2202mw1jwjmqq075ego96j8pomplqawtjrbpobmxlld0gjcau6-4bniw4tiqwa5j1iz02p65iqwj 172.16.0.89:2377
  • 查看集群信息

執行 docker node ls 命令查看節點信息:

docker node ls

執行 docker info 命令查看詳細信息:

docker info

  •  添加節點到swarm集群中

登錄到node1節點上,執行前面創建swarm集群時輸出的命令:

docker swarm join --token SWMTKN-1-2202mw1jwjmqq075ego96j8pomplqawtjrbpobmxlld0gjcau6-4bniw4tiqwa5j1iz02p65iqwj 172.16.0.89:2377

如果想要將其他更多的節點添加到這個swarm集群中,添加方法如上一致!

然后在manager-node管理節點上看一下集群節點的狀態:

  •  Node Availablity
swarm集群中node的availability狀態可以為:
  1. active:執行現有的task,且可以接受來自manager節點新的task分派;
  2. pause:現有的task繼續執行,但不能指派新的task至該node,故障排除時會用到
  3. drain:把現有的task分派給其它node,且不再接受來自manager節點的任務分派,維護時會用到

有些文章會建議維護時可以把manager node設為drain,但實際上你會需要在manager node做管理的事情,例如有monitoring tools要跑(e.g. Portainer, swarm web GUI),或是需要與swarm溝通的logging engine,這些容器可不能被停掉(drain/pause),尤其這兩個狀態如果容器出了任何問題,沒辦法重新建立,建議不要用在manager node,而是用label的方式來限制(控制)manager tasks

示例1、下線節點:
docker node update --availability drain node1

如上,當node1的狀態改為drain后,那么該節點就不會接受task任務分發,就算之前已經接受的任務也會轉移到別的節點上。

示例2、上線節點:

docker node update --availability active node1

再次修改為active狀態(即將下線的節點再次上線)

示例3、manager只作為管理節點????

在正式的生產環境中我們都建議這么做,因為在容器編排當中,區分Worker 和Master節點的主要原因是因為Worker 只負責完成任務,啟動服務,而Master則負責任務的調配,一旦Master節點也運行服務,導致Master節點負載過重,則會使集群發生崩潰,所以工作節點排除manager是很有必要的。

docker node update --availability drain manager
  • 刪除節點
docker node rm --force node1

  • 離開集群

在node1節點執行以下命令離開集群:

docker swarm leave

 

 

三、部署服務

  • 設置網絡

在啟動容器之前,先來創建一個覆蓋網絡,用來保證在不同主機上的容器網絡互通的網絡模式

docker network create -d overlay mrp_net

查看網絡是否創建成功:

docker network ls

  • 創建服務

在manager-node節點上使用上面這個覆蓋網絡創建相應的服務,我這里用的是自己的應用masl:

docker service create --name masl -e TZ="Asia/Shanghai" --network mrp_net --replicas 2 -p 8081:8080 172.16.99.2:40305/masl:dev-yc-34

其中,--replicas 參數指定服務由幾個實例組成。

使用 docker service ls 查看正在運行服務的列表:

docker service ls

使用 docker service inspect --pretty masl 查看服務信息:

docker service inspect --pretty masl

--pretty 使命令輸出格式化為可讀的格式,不加 --pretty 可以輸出更詳細的信息

使用docker service ps masl 查詢到哪個節點正在運行該服務。
如下該容器被調度到manager-node節點上啟動了,然后訪問http: //182 .48.115.237即可訪問這個容器應用(如果調度到其他節點,訪問也是如此)
docker service ps masl

有上面命令可知,該服務分別在manager-node和node1節點上運行。分別登陸這2個節點,可以查看到masl容器在運行中

登陸manager-node節點查看:

登陸node1節點查看: 

 

 

四、總結

1、Swarm上手很簡單,Docker swarm可以非常方便的創建類似kubernetes那樣帶有副本的服務,確保一定數量的容器運行,保證服務的高可用,但功能比較簡單;

2、Swarm、Kubernetes、Messos比較:

  • Swarm的優點和缺點都是使用標准的Docker接口,使用簡單,容易集成到現有系統,但是更困難支持更復雜的調度,比如以定制接口方式定義的調度。
  • Kubernetes 是自成體系的管理工具,有自己的服務發現和復制,需要對現有應用的重新設計,但是能支持失敗冗余和擴展系統。
  • Mesos是低級別 battle-hardened調度器,支持幾種容器管理框架如Marathon, Kubernetes, and Swarm,現在Kubernetes和Mesos穩定性超過Swarm,在擴展性方面,Mesos已經被證明支持超大規模的系統,比如數百數千台主機,但是,如果你需要小的集群,比如少於一打數量的節點服務器數量,Mesos也許過於復雜了
 
 
 
參考資料:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM