在 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.internal和ip-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>
內容解密:
docker node update --availability drain <node-name>命令用於將指定節點設定為drain狀態,使其上的服務任務被關閉並在其他可用節點上啟動。- 當一個節點被設定為
drain狀態後,docker node ls命令將顯示該節點的狀態為Drain。 - 使用
docker node inspect <node-name>命令可以檢視節點的詳細資訊,包括其可用性狀態。 - 將一個處於
drain狀態的節點還原為active狀態,可以使用docker node update --availability active <node-name>命令。 - 節點還原為
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 金鑰對
- 選擇 EC2 AWS 服務並點選 EC2 控制檯中的 Key Pairs 連結。
- 點選 Create Key Pair 以建立並下載金鑰對。
- 在 Create Key Pair 對話方塊中指定金鑰對名稱(例如
docker),然後點選 Create。 - 將金鑰對檔案(
docker.pem)複製到本地 Linux 機器。 - 設定
docker.pem的許可權為 400,以移除所有其他許可權。chmod 400 docker.pem
建立 Docker Swarm 的 AWS CloudFormation Stack
- 前往 Docker for AWS 檔案頁面,點選 Deploy Docker for AWS 選項。
- 在 Create Stack 精靈中,選擇 Specify an Amazon S3 Template URL 選項,使用預先指定的 URL。
- 在 Specify Details 中,指定堆積疊名稱(例如
DockerSwarm)。- 設定 Swarm 管理節點數量(預設為 3)和工作節點數量(預設為 5)。
Swarm 引數
| 引數 | 描述 |
|---|---|
| Number of Swarm managers? | Swarm 管理節點數量。有效值為 1、3 和 5。 |
| Number of Swarm worker nodes? | Swarm 中的工作節點數量(0-1000)。 |
- 指定 Swarm 屬性:
- 選擇之前建立的 SSH 金鑰(例如
docker)。 - 設定是否啟用每日資源清理(預設為
no)。 - 設定是否將容器日誌傳送到 CloudWatch(預設為
yes)。
- 選擇之前建立的 SSH 金鑰(例如
Swarm 屬性
| 屬性 | 描述 | 設定值 |
|---|---|---|
| Which SSH key to use? | 用於啟使用案例項 SSH 存取的現有 EC2 金鑰對名稱。 | docker |
| Enable daily resource cleanup? | 清理未使用的映像、容器、網路和磁碟區。 | no |
| Use CloudWatch for container logging? | 將所有容器日誌傳送到 CloudWatch。 | yes |
- 設定 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 |
- 在進階選項中,設定 Rollback on Failure 為 Yes。
- 複查堆積疊設定,然後點選 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 環境,以滿足不同應用的需求。