開始使用群集模式

適用於:Windows Server 2022、Windows Server 2019、Windows Server 2016

什麼是「群集模式」?

群集模式是一項 Docker 功能,可提供內建的容器協調流程功能,包括 Docker 主機的原生叢集,以及容器工作負載的排程。 當 Docker 引擎以「群集模式」一起執行時,一組 Docker 主機會形成「群集」叢集。 如需群集模式的其他內容,請參閱 Docker 的主要文件網站

管理員節點和背景工作節點

群集是由兩種類型的容器主機所組成: 管理員節點背景工作節點。 每個群集都會透過管理員節點初始化,而且所有用來控制及監視群集的 Docker CLI 命令都必須從其中一個管理員節點執行。 管理員節點可視為 Swarm 狀態的「保留者」,它們會形成共識群組,以維持對在群集上執行之服務狀態的感知,而且其工作可確保群集的實際狀態一律符合其預期狀態,如開發人員或系統管理員所定義。

注意

任何給定的群集都可以有多個管理員節點,但必須一律「至少有一個」

背景工作節點是由 Docker 群集透過管理員節點協調。 若要加入群集,背景工作節點必須使用管理員節點在初始化群集時所產生的「聯結令牌」。 背景工作節點只會從管理員節點接收和執行工作,因此它們不需要(且擁有)對群集狀態的感知。

叢集模式系統需求

至少一個實體或虛擬計算機系統(建議至少使用兩個節點的完整功能)執行 Windows 10 Creators Update具有所有最新更新的 Windows Server 2016*、設定為容器主機(請參閱 Windows 10 上的 Windows 容器主題Windows Server 上的 Windows 容器,以取得如何在 Windows 10 上開始使用 Docker 容器的詳細資訊)。

*注意:Windows Server 2016 上的 Docker Swarm 需要 KB4015217

Docker 引擎 1.13.0 或更新版本

開啟埠:每個主機上都必須提供下列埠。 在某些系統上,預設會開啟這些埠。

  • 用於叢集管理通訊的 TCP 連接埠 2377
  • TCP 和 UDP 連接埠 7946,用於節點之間的通訊
  • 重疊網路流量的 UDP 埠 4789

初始化 Swarm 叢集

若要初始化群集,只需從其中一個容器主機執行下列命令(以 <主計算機的本機 IPv4 位址取代 HOSTIPADDRESS> ):

# Initialize a swarm
C:\> docker swarm init --advertise-addr=<HOSTIPADDRESS> --listen-addr <HOSTIPADDRESS>:2377

從指定的容器主機執行此命令時,該主機上的 Docker 引擎會以管理員節點的形式開始以群集模式執行。

將節點新增至群集

多個節點「不」需要利用群集模式及覆疊網路功能模式功能。 所有群集/重疊功能都可以與在群集模式中執行的單一主機搭配使用(也就是管理員節點,使用 docker swarm init 命令進入群集模式)。

將背景工作新增至群集

一旦從管理員節點初始化群集之後,其他主機就可以使用另一個簡單的命令,將其他主機新增至群集作為背景工作角色:

C:\> docker swarm join --token <WORKERJOINTOKEN> <MANAGERIPADDRESS>

在這裡, <MANAGERIPADDRESS> 是群集管理員節點的本機 IP 位址,而 <WORKERJOINTOKEN> 是從管理員節點執行的命令所提供的 docker swarm init 背景工作加入令牌。 您也可以在初始化群集之後,從管理員節點執行下列其中一個命令,以取得聯結令牌:

# Get the full command required to join a worker node to the swarm
C:\> docker swarm join-token worker

# Get only the join-token needed to join a worker node to the swarm
C:\> docker swarm join-token worker -q

將管理員新增至群集

您可以使用下列命令,將其他管理員節點新增至叢集:

C:\> docker swarm join --token <MANAGERJOINTOKEN> <MANAGERIPADDRESS>

同樣地, <MANAGERIPADDRESS> 是群集管理員節點的本機 IP 位址。 聯結令牌 <MANAGERJOINTOKEN> 是 群集的管理員 聯結令牌,可從現有的管理員節點執行下列其中一個命令來取得:

# Get the full command required to join a **manager** node to the swarm
C:\> docker swarm join-token manager

# Get only the join-token needed to join a **manager** node to the swarm
C:\> docker swarm join-token manager -q

建立重迭網路

設定群集叢集之後,即可在群集上建立覆迭網路。 您可以從群集管理員節點執行下列命令來建立重疊網路:

# Create an overlay network
C:\> docker network create --driver=overlay <NETWORKNAME>

在這裡, <NETWORKNAME> 是您想要提供給網路的名稱。

將服務部署至群集

建立重疊網路之後,即可建立服務並連結至網路。 服務會使用下列語法建立:

# Deploy a service to the swarm
C:\> docker service create --name=<SERVICENAME> --endpoint-mode dnsrr --network=<NETWORKNAME> <CONTAINERIMAGE> [COMMAND] [ARGS…]

在這裡, <SERVICENAME> 是您想要提供給服務的名稱--這是您將用來透過服務探索參考服務的名稱(使用 Docker 的原生 DNS 伺服器)。 <NETWORKNAME> 是您想作為此服務連接目標的網路名稱 (例如,"myOverlayNet")。 <CONTAINERIMAGE> 是要定義服務的容器映像名稱。

注意

需要此命令的第二個引數 --endpoint-mode dnsrr,才能指定至將會使用 DNS 循環配置資源原則 (以平衡服務容器端點間網路流量) 的 Docker 引擎。 DNS 循環配置資源是目前 Windows Server 2016 唯一支援的負載平衡策略。Windows Docker 主機的路由網格可在 Windows Server 2019 (及更新版本) 上受到支援,但 Windows Server 2016 不支援此功能。 現今,使用者如果要尋找 Windows Server 2016 上的替代負載平衡策略,可以設定外部負載平衡器 (例如 NGINX),並使用群集的發行連接埠模式公開要透過其平衡流量的容器主機連接埠。

調整服務

將服務部署至群集叢集之後,組成該服務的容器實例會部署在叢集上。 根據預設,支援服務的容器實例數目—服務的「複本」或「工作」數目—就是一個。 不過,您可以使用 命令的選項docker service create,或藉由在建立服務之後調整服務,使用--replicas多個工作建立服務來建立服務。

服務延展性是 Docker Swarm 提供的主要優點,也可以透過單一 Docker 命令來運用:

C:\> docker service scale <SERVICENAME>=<REPLICAS>

在這裡, <SERVICENAME> 是正在調整的服務名稱,而 <REPLICAS> 是正在調整服務的工作或容器實例數目。

檢視群集狀態

有數個有用的命令可用來檢視群集的狀態,以及在群集上執行的服務。

列出群集節點

使用下列命令來查看目前加入群集的節點清單,包括每個節點的狀態資訊。 此命令必須從 管理員節點執行。

C:\> docker node ls

在此命令的輸出中,您會注意到其中一個以星號標記的節點 。;星號只會指出目前的 node--the node-the node is run the command from the docker node ls run.

列出網路

使用下列命令來查看存在於指定節點上的網路清單。 若要查看重迭網路,此命令必須從 以群集模式執行的管理員節點 執行。

C:\> docker network ls

列出服務

使用下列命令來查看目前在群集上執行的服務清單,包括其狀態的相關信息。

C:\> docker service ls

列出定義服務的容器實例

使用下列命令來查看針對指定服務執行的容器實例詳細數據。 此命令的輸出包含每個容器執行所在的標識碼和節點,以及容器狀態的輸出。

C:\> docker service ps <SERVICENAME>

Linux+Windows 混合 OS 叢集

最近,我們的小組成員發佈了一個簡短的三部分示範,說明如何使用 Docker Swarm 設定 Windows+Linux 混合 OS 應用程式。 如果您是 Docker Swarm 新手,或是使用它來執行混合作業系統應用程式,這是開始的絕佳位置。 立即取出:

初始化 Linux+Windows 混合 OS 叢集

初始化混合OS群集叢集很簡單,只要防火牆規則已正確設定,而且您的主機可以彼此存取,您只需要將Linux主機新增至群集就是標準 docker swarm join 命令:

C:\> docker swarm join --token <JOINTOKEN> <MANAGERIPADDRESS>

您也可以使用從 Windows 主機初始化叢集時執行的相同命令,從 Linux 主機初始化群集:

# Initialize a swarm
C:\> docker swarm init --advertise-addr=<HOSTIPADDRESS> --listen-addr <HOSTIPADDRESS>:2377

將標籤新增至群集節點

若要將 Docker 服務啟動至混合 OS 群集叢集,必須有一種方法來區分哪些群集節點正在執行該服務所設計的 OS,以及哪些節點不是。 Docker 物件標籤 標提供標記節點的實用方式,讓服務可以建立並設定為只在符合其 OS 的節點上執行。

注意

Docker 物件標籤可用來將中繼資料套用至各種 Docker 物件 (包括容器映像、容器、磁碟區和網路),以及用於各種用途 (例如您可以讓前端微服務僅排定在標示「前端」的節點上,而後端微服務僅排定在標示「後端」的節點上,利用標籤來分隔應用程式的「前端」和「後端」元件)。 在此情況下,我們會在節點上使用標籤來區分 Windows OS 節點和 Linux OS 節點。

若要為現有的群集節點加上標籤,請使用下列語法:

C:\> docker node update --label-add <LABELNAME>=<LABELVALUE> <NODENAME>

<LABELNAME>以下是您要建立的標籤名稱,例如,在此案例中,我們會將其OS區分節點,因此標籤的邏輯名稱可以是 “os”。 <LABELVALUE> 是標籤的值,在此案例中,您可以選擇使用值 "windows" 和 "linux"。 (當然,只要保持一致,您就可以為您的標籤和標籤值做出任何命名選擇)。 <NODENAME> 是您要標示的節點名稱;您可以執行 docker node ls 來提醒自己節點的名稱。

例如,如果您的叢集中有四個群集節點,包括兩個 Windows 節點和兩個 Linux 節點,您的標籤更新命令可能如下所示:

# Example -- labeling 2 Windows nodes and 2 Linux nodes in a cluster...
C:\> docker node update --label-add os=windows Windows-SwarmMaster
C:\> docker node update --label-add os=windows Windows-SwarmWorker1
C:\> docker node update --label-add os=linux Linux-SwarmNode1
C:\> docker node update --label-add os=linux Linux-SwarmNode2

將服務部署至混合OS群集

使用群集節點的標籤,將服務部署至叢集很容易;只要使用 --constraint 命令的選項 docker service create

# Deploy a service with swarm node constraint
C:\> docker service create --name=<SERVICENAME> --endpoint-mode dnsrr --network=<NETWORKNAME> --constraint node.labels.<LABELNAME>=<LABELVALUE> <CONTAINERIMAGE> [COMMAND] [ARGS…]

例如,使用上述範例中的標籤和標籤命名法,一組服務建立命令-一個用於 Windows 型服務,另一個用於以 Linux 為基礎的服務--可能看起來像這樣:

# Example -- using the 'os' label and 'windows'/'linux' label values, service creation commands might look like these...

# A Windows service
C:\> docker service create --name=win_s1 --endpoint-mode dnsrr --network testoverlay --constraint 'node.labels.os==windows' microsoft/nanoserver:latest powershell -command { sleep 3600 }

# A Linux service
C:\> docker service create --name=linux_s1 --endpoint-mode dnsrr --network testoverlay --constraint 'node.labels.os==linux' redis

限制

目前,Windows 上的群集模式有下列限制:

  • 不支援資料平面加密(也就是使用 選項的 --opt encrypted 容器容器流量)
  • Windows Server 2016 不支援 Windows Docker 主機的路由網格,但從 Windows Server 2019 後開始支援。 現今尋求替代負載平衡策略的用戶可以設定外部負載平衡器(例如 NGINX),並使用 Swarm 的 發佈埠模式 來公開容器主機埠,以便進行負載平衡。 以下詳述此內容。

注意

如需有關如何設定 Docker Swarm 路由網格的詳細資訊,請參閱此部落格文章

發佈服務端點的埠

想要為服務端點發佈連接埠的使用者,現在可以使用發佈連接埠模式或 Docker Swarm 的路由網格功能來執行此作業。

若要讓定義服務的每個工作/容器端點發佈主機埠,請使用 --publish mode=host,target=<CONTAINERPORT> 命令的 docker service create 自變數:

# Create a service for which tasks are exposed via host port
C:\ > docker service create --name=<SERVICENAME> --publish mode=host,target=<CONTAINERPORT> --endpoint-mode dnsrr --network=<NETWORKNAME> <CONTAINERIMAGE> [COMMAND] [ARGS…]

例如,下列命令會建立服務 's1',其中每個工作都會透過容器埠 80 和隨機選取的主機埠公開。

C:\ > docker service create --name=s1 --publish mode=host,target=80 --endpoint-mode dnsrr web_1 powershell -command {echo sleep; sleep 360000;}

使用發佈埠模式建立服務之後,可以查詢服務來檢視每個服務工作的埠對應:

C:\ > docker service ps <SERVICENAME>

上述命令會傳回針對服務執行的每個容器實例的詳細數據(在所有群集主機中)。 輸出的一個數據行「埠」數據行會包含 HOSTPORT-CONTAINERPORT>>></tcp 格式<之每部主機的埠資訊。 針對每個容器執行個體,<HOSTPORT> 的值各不相同,因為每個容器都是在自己的主機連接埠上發佈。

提示 與深入解析

現有的透明網路可以阻止初始化群集/建立覆疊網路

在 Windows 上,重疊和透明網路驅動程式都需要外部 vSwitch 系結至 (虛擬) 主機網路適配器。 建立重迭網路時,會建立新的交換器,然後附加至開啟的網路適配器。 透明網路模式也會使用主機網路適配器。 同時,任何指定的網路適配器一次只能系結至一個交換器-如果主機只有一張網路適配器,它一次只能附加至一個外部 vSwitch,不論該 vSwitch 是用於重迭網路還是透明網路。

因此,如果容器主機只有一張網路適配器,就有可能遇到透明網路封鎖建立重疊網路的問題(反之亦然),因為透明網路目前佔用主機唯一的虛擬網路介面。

有兩種方式可以解決此問題:

  • 選項 1 - 刪除現有的透明網路: 在初始化群集之前,請確定容器主機上沒有現有的透明網路。 刪除透明網路,以確保您的主機上有免費的虛擬網路適配器,以用於重迭網路建立。
  • 選項 2 - 在您的主機上建立額外的 (虛擬) 網路適配器: 不要移除主機上的任何透明網路,而是可以在主機上建立額外的網路適配器,以用於重迭網路建立。 若要這樣做,只要建立新的外部網路適配器(使用 PowerShell 或 Hyper-V 管理員):有了新的介面,當您的群集初始化時,主機網路服務 (HNS) 會自動在您的主機上辨識它,並用它來系結外部 vSwitch 以建立重迭網路。