一、機器環境
- 機器規划
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狀態可以為:
active:執行現有的task,且可以接受來自manager節點新的task分派;
- pause:現有的task繼續執行,但不能指派新的task至該node,故障排除時會用到
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
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也許過於復雜了