返回文章列表

Docker Swarm 模式下的節點管理操作

本文介紹 Docker Swarm 模式下的節點管理操作,包含檢視服務資訊、副本分佈、節點資訊,以及節點的升降級、移除和離開 Swarm 等操作。同時,也涵蓋瞭如何使用 Docker for AWS 建立多區域 Swarm 叢集,以提高服務的可用性和容錯能力,並提供詳細的環境設定和操作步驟。

容器技術 雲端服務

在 Docker Swarm 模式下,有效管理節點對於維護服務的穩定性和高用性至關重要。理解如何檢視服務與節點資訊、管理節點狀態、以及操作節點的升降級和移除,是建構穩固 Docker Swarm 環境的基礎。更進一步,利用 Docker for AWS 建立多區域 Swarm,更能提升服務的容錯能力,避免單一區域故障帶來的風險。這需要熟悉 AWS CloudFormation、VPC 設定以及相關的 SSH 金鑰管理,才能順利佈署和管理跨區域的 Docker Swarm 叢集。

使用 Docker 在 Swarm 模式下的操作

檢視服務詳細資訊

在 Docker Swarm 模式下,可以使用 docker service inspect 命令來取得服務的詳細資訊,包括服務的組態、副本數量、更新狀態等。

docker service inspect helloworld

內容解密:

  • docker service inspect 命令用於檢視服務的詳細組態和狀態。
  • 輸出結果包含服務的 ID、版本、副本數量、更新組態、端點規格等資訊。
  • Replicas 欄位顯示了服務的副本數量,本例中為 2。
  • UpdateConfig 定義了服務更新時的平行性和失敗處理策略。
  • EndpointSpec 中的 Mode 設定為 vip,表示服務使用虛擬 IP(VIP)模式。

檢視服務副本分佈

可以使用 docker service ps 命令來檢視服務副本的分佈情況,包括每個副本執行的節點。

docker service ps helloworld

內容解密:

  • docker service ps 命令用於列出服務的副本及其執行狀態。
  • 輸出結果顯示了每個副本的 ID、名稱、映像檔、節點、期望狀態和當前狀態。
  • 本例中,兩個副本分別執行在 ip-172-30-5-70.ec2.internalip-172-30-5-108.ec2.internal 節點上。

檢視節點上的容器

在 Swarm 模式下,可以使用 docker ps 命令在工作節點上檢視正在執行的容器。

docker ps

內容解密:

  • docker ps 命令用於列出節點上所有正在執行的容器。
  • 在 Swarm 模式下,該命令可以顯示服務容器,但不限於服務容器。
  • 本例中,docker ps 命令在不同節點上執行,顯示了執行中的服務容器及其名稱。

取得節點詳細資訊

可以使用 docker node inspect 命令來取得節點的詳細資訊,包括節點角色、可用性、主機名、資源容量等。

docker node inspect ip-172-30-5-70.ec2.internal

內容解密:

  • docker node inspect 命令用於檢視節點的詳細組態和狀態。
  • 輸出結果包含節點的 ID、版本、建立時間、規格、描述、狀態和管理狀態等資訊。
  • 本例中,輸出了管理節點 ip-172-30-5-70.ec2.internal 的詳細資訊,包括其角色、可用性、資源容量等。

移除服務

可以使用 docker service rm 命令來移除一個服務。

docker service rm helloworld

內容解密:

  • docker service rm 命令用於刪除指定的服務。
  • 刪除服務後,使用 docker service inspect 命令將無法找到該服務。
  • 同時,使用 docker ps 命令將不再顯示該服務的容器。

將工作節點提升為管理節點

在 Swarm 模式下,可以將工作節點提升為管理節點,以增加叢集的管理能力。

docker node promote ip-172-30-5-108.ec2.internal

內容解密:

  • docker node promote 命令用於將工作節點提升為管理節點。
  • 本例中,將 ip-172-30-5-108.ec2.internal 節點提升為管理節點後,使用 docker node ls 命令可以看到其管理狀態變為 Reachable

將管理節點降級為工作節點

同樣,可以將管理節點降級為工作節點,以調整叢集的管理角色分配。

docker node demote ip-172-30-5-108.ec2.internal

內容解密:

  • docker node demote 命令用於將管理節點降級為工作節點。
  • 本例中,將 ip-172-30-5-108.ec2.internal 節點降級後,其管理狀態不再顯示,且不再具有管理能力。

使工作節點離開 Swarm

可以使用 docker swarm leave 命令使工作節點離開 Swarm 叢集。

docker swarm leave

內容解密:

  • docker swarm leave 命令用於使當前節點離開 Swarm 叢集。
  • 該命令需要在要離開叢集的節點上執行。

Docker Swarm 模式下的節點管理

在 Docker Swarm 模式下,節點的管理是確保服務高用性和容錯能力的關鍵。本章節將探討如何管理 Swarm 中的節點,包括使節點離開 Swarm、提升或降級節點的角色,以及修改節點的可用性。

使工作節點離開 Swarm

要使一個工作節點離開 Swarm,可以使用 docker swarm leave 命令。當工作節點執行此命令後,它將離開 Swarm,並且不再接收新的任務。

core@ip-172-30-5-31 ~ $ docker swarm leave
Node left the swarm.

同樣地,其他工作節點也可以透過執行相同的命令離開 Swarm。

core@ip-172-30-5-108 ~ $ docker swarm leave
Node left the swarm.

內容解密:

  • docker swarm leave:此命令用於使當前節點離開 Swarm。
  • 當工作節點離開 Swarm 後,它將被列為 Down 狀態,但仍然會出現在 docker node ls 命令的輸出中。

使管理節點離開 Swarm

使管理節點離開 Swarm 的過程與工作節點不同。如果 Swarm 中只有一個管理節點,直接執行 docker swarm leave 將會導致錯誤,因為這將摧毀整個 Swarm。

core@ip-172-30-5-70 ~ $ docker swarm leave
Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Removing the last manager erases all current state of the swarm. Use `--force` to ignore this message.

內容解密:

  • --force 選項:強制使管理節點離開 Swarm,即使這會導致 Swarm 狀態的丟失。
  • 當最後一個管理節點離開 Swarm 時,Swarm 將不再存在,需要重新初始化。

重新初始化 Swarm

如果 Swarm 因為管理節點的離開而失去共識(quorum),則需要使用 --force-new-cluster 選項重新初始化 Swarm。

core@ip-172-30-5-70 ~ $ docker swarm init --advertise-addr 172.30.5.70 --force-new-cluster
Swarm initialized: current node (cnyc2w3n8q8zuxjujcd2s729k) is now a manager.

內容解密:

  • --force-new-cluster:強制建立一個新的 Swarm 叢集,忽略現有的叢集狀態。
  • 重新初始化後,Swarm 將只有當前節點,需要重新新增其他節點。

修改節點可用性

可以使用 docker node update 命令配合 --availability 選項來修改節點的可用性。

core@ip-172-30-5-70 ~ $ docker node update --availability drain ip-172-30-5-108.ec2.internal
ip-172-30-5-108.ec2.internal

內容解密:

  • --availability 選項:用於設定節點的可用性狀態。
    • active:還原暫停或排空的節點到活躍狀態。
    • pause:暫停節點,使其不接收新任務。
    • drain:使工作節點變為不可用狀態,不再接收新任務;對於管理節點,也使其不可用於排程新任務,但仍執行 Swarm 管理任務。

透過這些操作,可以有效地管理 Docker Swarm 中的節點,確保服務的連續性和高用性。

使用Docker在Swarm模式下的節點管理

在Docker Swarm模式中,節點的管理是至關重要的。本章將探討如何使用Docker在Swarm模式下進行節點管理,包括節點的初始化、加入、升降級、離開和刪除等操作。

初始化Swarm模式

要使用Docker在Swarm模式下,首先需要初始化Swarm模式。初始化Swarm模式會將當前節點設定為管理節點。

初始化命令

docker swarm init

此命令將當前節點初始化為Swarm的管理節點,並提供加入Swarm的命令供其他節點使用。

加入工作節點到Swarm

其他節點可以透過執行docker swarm join命令加入到Swarm中,成為工作節點。

加入命令

docker swarm join --token <token> <manager-node-ip>:2377

工作節點加入Swarm後,可以透過docker node ls命令檢視節點列表。

節點的升降級

在Swarm模式下,可以將工作節點升級為管理節點,也可以將管理節點降級為工作節點。

升級工作節點到管理節點

docker node promote <node-name>

降級管理節點到工作節點

docker node demote <node-name>

節點的離開和重新加入

工作節點可以透過執行docker swarm leave命令離開Swarm。如果需要重新加入,可以再次執行docker swarm join命令。

離開Swarm

docker swarm leave

強制刪除節點

如果需要從Swarm中刪除一個節點,可以在管理節點上使用docker node rm命令。

docker node rm <node-name>

在刪除管理節點之前,需要先將其降級為工作節點,然後使其離開Swarm。

修改節點可用性

可以透過docker node update命令修改節點的可用性,例如將一個節點設定為drain狀態,使其上的服務任務被遷移到其他可用節點。

設定節點為drain狀態

docker node update --availability drain <node-name>

將drain狀態的節點還原為active狀態

docker node update --availability active <node-name>

內容解密:

  1. docker node update --availability drain <node-name> 命令用於將指定節點設定為drain狀態,使其上的服務任務被關閉並在其他可用節點上啟動。
  2. 當一個節點被設定為drain狀態後,docker node ls 命令將顯示該節點的狀態為Drain
  3. 使用 docker node inspect <node-name> 命令可以檢視節點的詳細資訊,包括其可用性狀態。
  4. 將一個處於drain狀態的節點還原為active狀態,可以使用 docker node update --availability active <node-name> 命令。
  5. 節點還原為active狀態後,可以再次接受新的服務任務。

使用Docker for AWS建立多區域Swarm

Docker Swarm是一種分散式服務佈署工具,用於Docker應用程式。預設情況下,Docker Swarm在AWS上被佈署在單一區域內,這使得它存在單點故障的風險。本章將介紹如何使用Docker for AWS建立一個多區域的Swarm,以提高其可用性和容錯能力。

問題:單區域Swarm的侷限性

單區域Swarm的所有管理和工作節點都位於同一個AWS區域內。如果該區域發生故障,整個Swarm將變得不可用。因此,單區域Swarm不是一個高可用性的佈署方案。

解決方案:使用Docker for AWS建立多區域Swarm

Docker for AWS是一種根據圖形使用者介面(GUI)的佈署平台,可以自動在多個AWS區域內組態Docker Swarm。這樣,即使某個區域發生故障,其他區域的管理和工作節點仍然可以保持Swarm的執行,從而提高其可用性和容錯能力。

Docker for AWS的優勢

  • 自動組態所需的基礎設施。
  • 自動升級到新的軟體版本而不中斷服務。
  • 使用針對Docker最佳化的自定義Linux發行版,並使用overlay2儲存驅動程式。
  • 自動清理未使用的Docker資源。
  • 使用自動縮放組來管理節點。

多區域Swarm架構

透過Docker for AWS建立的多區域Swarm,其管理和工作節點分佈在多個AWS區域內。這種架構可以有效地避免單點故障,提高Swarm的可用性和容錯能力。

多區域Swarm架構圖示

此圖示說明瞭多區域Swarm的架構,其中管理和工作節點分佈在不同的AWS區域內,共同組成了一個高可用性的Docker Swarm叢集。

使用 Docker 在 AWS 上建立多區域 Swarm 叢集

環境設定

在 AWS 上使用 Docker 有兩種佈署選項:

  • 使用現有的 VPC
  • 由 Docker 建立新的 VPC

本章節選擇較簡單的由 Docker 建立 VPC、子網路和閘道的方式。

首先,需要建立一個支援 EC2-VPC 的 AWS 帳戶。即使 AWS 服務(如 VPC)是自動建立的,帳戶仍需具備建立 EC2 例項、自動擴充套件群組、IAM 組態、DynamoDB 表格、SQS 佇列、VPC(包括子網路、閘道和安全群組)、彈性負載平衡器和 CloudWatch 日誌群組的許可權。

設定 SSH 金鑰對

  1. 選擇 EC2 AWS 服務並點選 EC2 控制檯中的 Key Pairs 連結。
  2. 點選 Create Key Pair 以建立並下載金鑰對。
  3. 在 Create Key Pair 對話方塊中指定金鑰對名稱(例如 docker),然後點選 Create。
  4. 將金鑰對檔案(docker.pem)複製到本地 Linux 機器。
  5. 設定 docker.pem 的許可權為 400,以移除所有其他許可權。
    chmod 400 docker.pem
    

建立 Docker Swarm 的 AWS CloudFormation Stack

  1. 前往 Docker for AWS 檔案頁面,點選 Deploy Docker for AWS 選項。
  2. 在 Create Stack 精靈中,選擇 Specify an Amazon S3 Template URL 選項,使用預先指定的 URL。
  3. 在 Specify Details 中,指定堆積疊名稱(例如 DockerSwarm)。
    • 設定 Swarm 管理節點數量(預設為 3)和工作節點數量(預設為 5)。

Swarm 引數

引數描述
Number of Swarm managers?Swarm 管理節點數量。有效值為 1、3 和 5。
Number of Swarm worker nodes?Swarm 中的工作節點數量(0-1000)。
  1. 指定 Swarm 屬性:
    • 選擇之前建立的 SSH 金鑰(例如 docker)。
    • 設定是否啟用每日資源清理(預設為 no)。
    • 設定是否將容器日誌傳送到 CloudWatch(預設為 yes)。

Swarm 屬性

屬性描述設定值
Which SSH key to use?用於啟使用案例項 SSH 存取的現有 EC2 金鑰對名稱。docker
Enable daily resource cleanup?清理未使用的映像、容器、網路和磁碟區。no
Use CloudWatch for container logging?將所有容器日誌傳送到 CloudWatch。yes
  1. 設定 Swarm 管理節點和工作節點屬性,包括例項型別和儲存設定。

Swarm 管理節點屬性

屬性描述設定值
Swarm manager instance type?EC2 HVM 例項型別(例如 t2.micro、m3.medium)。t2.micro
Manager ephemeral storage volume size?管理節點的暫時儲存磁碟區大小(GB)。20
Manager ephemeral storage volume type?管理節點磁碟區型別。standard

Swarm 工作節點屬性

屬性描述設定值
Agent worker instance type?EC2 HVM 例項型別(例如 t2.micro、m3.medium)。t2.micro
Worker ephemeral storage volume size?工作節點的暫時儲存磁碟區大小(GB)。20
Worker ephemeral storage volume type?工作節點磁碟區型別。standard
  1. 在進階選項中,設定 Rollback on Failure 為 Yes。
  2. 複查堆積疊設定,然後點選 Create。

連線至 Swarm 管理節點

堆積疊建立完成後,可以在 Outputs 分頁中找到預設的 DNS 目標和管理節點資訊。

使用 Swarm

建立完成後,即可開始使用 Docker Swarm。

刪除 Swarm

當不再需要 Swarm 時,可以刪除整個 CloudFormation 堆積疊,以清理所有相關資源。

使用 Plantuml 圖表呈現流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Docker Swarm 模式下的節點管理操作

package "Docker 架構" {
    actor "開發者" as dev

    package "Docker Engine" {
        component [Docker Daemon] as daemon
        component [Docker CLI] as cli
        component [REST API] as api
    }

    package "容器運行時" {
        component [containerd] as containerd
        component [runc] as runc
    }

    package "儲存" {
        database [Images] as images
        database [Volumes] as volumes
        database [Networks] as networks
    }

    cloud "Registry" as registry
}

dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置

@enduml

此圖示展示了使用 Docker 在 AWS 上建立多區域 Swarm 叢集的流程。透過這個流程,可以快速建立和管理 Docker Swarm 環境,以滿足不同應用的需求。