Docker Swarm 叢集搭建

谢友海發表於2024-12-01

本章將和大家分享 Docker Swarm 叢集的搭建過程。廢話不多說,下面我們直接進入主題。

一、Docker Swarm 簡介

1、簡介

Docker Swarm 是 Docker 的叢集管理工具。它將 Docker 主機池轉變為單個虛擬 Docker 主機。 Docker Swarm 提供了標準的 Docker API,所有任何已經與 Docker 守護程式通訊的工具都可以使用 Swarm 輕鬆地擴充套件到多個主機。

支援的工具包括但不限於以下各項:

  • Dokku
  • Docker Compose
  • Docker Machine
  • Jenkins

2、原理

如下圖所示,swarm 叢集由管理節點(manager)和工作節點(work node)構成。

  • swarm mananger:負責整個叢集的管理工作包括叢集配置、服務管理等所有跟叢集有關的工作。
  • work node:即圖中的 available node,主要負責執行相應的服務來執行任務(task)。

3、什麼是Docker Swarm?

Swarm是Docker的一個編排工具,在之前我們只是在一臺機器來進行docker的管理:

但是有時容器並不一定都在一臺主機上,如果是分散式的處於多臺主機上,這時就可以藉助於Swarm,Swarm是Docker自帶的編排工具,只要你安裝了Docker就會存在Docker Swarm工具。

Swarm中的模式是有兩大類節點,一類是manager節點,另一類是worker節點,manager節點負責服務的建立和排程,worker節點主要是執行容器服務,當然manager節點也是可以執行容器服務的。

manager節點狀態、資訊的同步根據Raft consensus group的網路進行通訊同步的,而worker之間的通訊依靠的是Gossip network做到的。

另外一個重要的概念就是service,我們可以在一個manager節點上建立一個服務,但是可以根據這一個服務建立多個容器的任務,這些容器任務執行在不同的節點上。

4、如何進行Swarm叢集的搭建?

  • 在swarm模式下初始化一個Swarm叢集,並且將當前主機加入到該叢集作為manager節點
  • 加入其它節點到該叢集中
  • 部署service到該叢集中

二、Docker Swarm 叢集搭建

1、建立多節點叢集

1)準備多臺Linux伺服器

此處我準備了3臺機器:

其中 192.168.4.250 作為 manager 節點,其它兩臺作為 worker 節點。

2)檢視Swarm命令

docker swarm --help

可以看到其中有一個 init 命令,這就是初始化一個Swarm,我們再看看這個 init 的引數:

docker swarm init --help

可以看到它有很多的引數,其中第一個就是將本機的地址新增進去,讓自己成為一個manager節點,這樣其它的節點都可以知道這個節點的存在。

3)建立一個manager節點

在此之前我們應該先知道自己本機的ip,以便於“--advertise-addr string”這個引數使用,檢視本機ip:

ip addr

然後就可以初始化 manager 節點:

docker swarm init --advertise-addr=192.168.4.250

[root@localhost ~]# docker swarm init --advertise-addr=192.168.4.250
Swarm initialized: current node (c06ilqppns9dg7c1wsk63egyf) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1o3cg3ppm9ylolsb336cfyxp53a2nurn74s0nnt1r8loaf1w6z-5evpjdk9djt3qfude6smjvr5a 192.168.4.250:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

[root@localhost ~]#

可以看到已經建立了一個 swarm manager 節點,“--advertise-addr string”引數的值 192.168.4.250 是自己的ip地址,相當於將自己加入到 swarm 中。在執行的結果中也說明了其它 worker 加入的方式。

以上輸出,證明已經初始化成功。需要把以下這行復製出來,在增加工作節點時會用到:

docker swarm join --token SWMTKN-1-1o3cg3ppm9ylolsb336cfyxp53a2nurn74s0nnt1r8loaf1w6z-5evpjdk9djt3qfude6smjvr5a 192.168.4.250:2377

要向此叢集新增一個工作節點,直接執行以上這個命令即可。

4)開放manager節點的2377埠

# 檢視防火牆狀態
systemctl status firewalld

# 如果開啟了防火牆則永久放行2377埠
firewall-cmd --add-port=2377/tcp --permanent

# 重新載入防火牆
firewall-cmd --reload

# 檢視永久開放的埠
firewall-cmd --permanent --list-ports

5)建立worker節點

在建立 manager 節點時我們知道,要向此叢集新增一個工作節點,直接執行以下這個命令(建立manager節點的時候複製出來的)即可:

docker swarm join --token SWMTKN-1-1o3cg3ppm9ylolsb336cfyxp53a2nurn74s0nnt1r8loaf1w6z-5evpjdk9djt3qfude6smjvr5a 192.168.4.250:2377

此處,我另外再開啟了兩臺 Linux 伺服器,將它們加入到 swarm 中成為 worker 節點:

可以看到已經成功了。

6)檢視節點狀態

需要注意的是檢視節點狀態只能在 manager 節點那臺機器上檢視,普通節點無法執行檢視命令:

docker node ls

可以看到有三臺機器了。

這時候使用 docker info 命令檢視,就可以看到 Swarm 處於啟用狀態:

docker info

2、部署服務到叢集中

注意:跟叢集管理有關的任何操作,都是在管理節點上操作的。

上面我們已經將節點建立好了,現在可以在這些節點上建立服務了,那麼就需要看看 docker service 的幫助資訊:

docker service --help

[root@localhost ~]# docker service --help

Usage:  docker service COMMAND

Manage Swarm services

Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service's configuration
  scale       Scale one or multiple replicated services
  update      Update a service

Run 'docker service COMMAND --help' for more information on a command.
[root@localhost ~]#

可以看到有 create 這個命令,可以這樣理解,docker service create 相當於docker run 就是建立容器,只不過在 swarm 中是不同的表現方式。

1)在manager節點上部署服務

docker service create --name nginx-service nginx

可以檢視是否建立成功:

docker service ls

可以具體檢視這個 service 的內容(例如:檢視服務執行在哪個節點上):

docker service ps nginx-service

檢視服務 nginx-service 部署的具體資訊:

docker service inspect --pretty nginx-service

2)擴充套件叢集服務(水平擴充套件)

我們將上述的 nginx-service 服務擴充套件到多個節點。

docker service scale nginx-service=5

已經有5個 nginx-service 服務的容器正在執行了。可以先看看serverice:

docker service ls

再看看具體的容器數量:

docker service ps nginx-service

可以看到5個容器在不同的節點上,其中有2個在manager節點,有3個在worker節點上。

當然,每一個節點都可以自己檢視自己目前執行的容器,比如worker節點檢視自己執行的容器:

docker ps

3)自動修復

scale在swarm中除了水平擴充套件外,還有一個作用,那就是修復作用,比如將某一個節點中的容器刪除掉,那麼很快swarm中發覺並進行修復,最終數量還是會和原來的保持一致。

假如現在刪除worker中的一個容器:

docker rm -f 容器Id

我們在manager節點中檢視容器情況:

可以看到紅色就是我們刪掉的容器,但是後面它又馬上補充了一個,保持了整個系統的穩定性。

4)刪除服務

# 語法
docker service rm 服務名稱

# 示例
docker service rm nginx-service

# 檢視是否已刪除
docker service ps nginx-service

5)停止某個節點接收新的任務

檢視所有的節點:

docker node ls

可以看到目前所有的節點都是Active,可以接收新的任務分配。

停止節點worker-node1:

docker node update --availability drain worker-node1

注意:worker-node1狀態變為Drain。不會影響到叢集的服務,只是 worker-node1 節點不再接收新的任務,叢集的負載能力有所下降。

重新啟用節點worker-node1:

docker node update --availability active worker-node1

本文部分內容參考博文:https://www.runoob.com/docker/docker-swarm.html

至此本文就全部介紹完了,如果覺得對您有所啟發請記得點個贊哦!!!

此文由博主精心撰寫轉載請保留此原文連結:https://www.cnblogs.com/xyh9039/p/18578834

版權宣告:如有雷同純屬巧合,如有侵權請及時聯絡本人修改,謝謝!!!

相關文章