在 Swarm 模式下運行 Docker 引擎

當您第一次安裝並開始使用 Docker Engine 時,預設會停用 Swarm 模式。啟用 Swarm 模式後,您將使用透過 docker service 指令管理服務的概念。

有兩種方式可以 Swarm 模式執行引擎

當您在本機電腦上以 Swarm 模式執行引擎時,您可以根據您建立的映像檔或其他可用的映像檔來建立和測試服務。在您的生產環境中,Swarm 模式提供了一個具有叢集管理功能的容錯平台,以保持您的服務持續運行和可用。

這些說明假設您已在一台機器上安裝 Docker Engine,以作為 swarm 中的管理節點。

如果您尚未閱讀,請參閱 Swarm 模式關鍵概念 並嘗試 Swarm 模式教學

建立叢集

當您執行建立 swarm 的指令時,Docker Engine 會開始以 Swarm 模式執行。

執行 docker swarm init 以在目前的節點上建立單節點 swarm。引擎會設定 swarm 如下

  • 將目前的節點切換到 Swarm 模式。
  • 建立一個名為 default 的 swarm。
  • 將目前的節點指定為 swarm 的領導管理節點。
  • 使用機器主機名稱命名節點。
  • 將管理節點設定為在埠 `2377` 上監聽活動網路介面。
  • 將目前的節點設定為 Active 可用性,表示它可以從排程器接收任務。
  • 啟動一個內部分散式資料儲存庫,供參與 swarm 的引擎維護 swarm 和在其上執行的所有服務的一致性視圖。
  • 預設情況下,會為 swarm 產生一個自我簽署的根 CA。
  • 預設情況下,會產生供工作節點和管理節點加入 swarm 的權杖。
  • 建立一個名為 ingress 的覆蓋網路,用於發佈 swarm 外部的服務埠。
  • 為您的網路建立覆蓋預設 IP 位址和子網路遮罩

docker swarm init 的輸出提供了當您將新的工作節點加入 swarm 時要使用的連線指令

$ docker swarm init
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.

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

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

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

設定預設地址池

預設情況下,Swarm 模式使用預設地址池 10.0.0.0/8 作為全域範圍(覆蓋)網路。每個未指定子網路的網路都會從此池中依序分配一個子網路。在某些情況下,可能需要為網路使用不同的預設 IP 地址池。

例如,如果預設的 10.0.0.0/8 範圍與網路中已分配的地址空間衝突,則最好確保網路使用不同的範圍,而無需 swarm 使用者使用 --subnet 指令指定每個子網路。

要設定自定義預設地址池,您必須在 swarm 初始化時使用 --default-addr-pool 命令列選項定義池。此命令列選項使用 CIDR 標記法定義子網路遮罩。要為 Swarm 建立自定義地址池,您必須定義至少一個預設地址池,以及一個可選的預設地址池子網路遮罩。例如,對於 10.0.0.0/27,請使用值 27

Docker 從 --default-addr-pool 選項指定的地址範圍分配子網路地址。例如,命令列選項 --default-addr-pool 10.10.0.0/16 表示 Docker 將從該 /16 地址範圍分配子網路。如果未指定 --default-addr-pool-mask-len 或明確設定為 24,則會產生 256 個 /24 網路,格式為 10.10.X.0/24

子網路範圍來自 --default-addr-pool(例如 10.10.0.0/16)。其中的 16 代表可以在該 default-addr-pool 範圍內建立的網路數量。--default-addr-pool 選項可以出現多次,每個選項都提供 docker 用於覆蓋子網路的其他地址。

指令格式為

$ docker swarm init --default-addr-pool <IP range in CIDR> [--default-addr-pool <IP range in CIDR> --default-addr-pool-mask-length <CIDR value>]

10.20.0.0 網路建立 /16(B 類)預設 IP 地址池的指令如下所示

$ docker swarm init --default-addr-pool 10.20.0.0/16

10.20.0.010.30.0.0 網路建立 /16(B 類)預設 IP 地址池,並為每個網路建立 /26 子網路遮罩的指令如下所示

$ docker swarm init --default-addr-pool 10.20.0.0/16 --default-addr-pool 10.30.0.0/16 --default-addr-pool-mask-length 26

在此範例中,docker network create -d overlay net1 將導致 10.20.0.0/26 作為 net1 的已分配子網路,而 docker network create -d overlay net2 將導致 10.20.0.64/26 作為 net2 的已分配子網路。這將持續到所有子網路都用盡為止。

請參閱以下頁面以取得更多資訊

  • 有關預設地址池用法的更多資訊,請參閱 Swarm 網路
  • 有關 --default-addr-pool 旗標的更多詳細資訊,請參閱 docker swarm init CLI 參考

設定宣告地址

管理節點使用宣告地址允許 swarm 中的其他節點存取 Swarmkit API 和覆蓋網路。swarm 上的其他節點必須能夠透過其宣告地址存取管理節點。

如果您沒有指定 advertise 位址,Docker 會檢查系統是否只有一個 IP 位址。如果是,Docker 預設會使用該 IP 位址和監聽埠 2377。如果系統有多個 IP 位址,您必須指定正確的 --advertise-addr 才能啟用管理節點間的通訊和覆蓋網路。

$ docker swarm init --advertise-addr <MANAGER-IP>

如果其他節點連線到第一個管理節點的位址與該管理節點本身看到的位址不同,您也必須指定 --advertise-addr。例如,在跨不同區域的雲端設定中,主機同時具有區域內部存取的內部位址和從區域外部存取的外部位址。在此情況下,請使用 --advertise-addr 指定外部位址,以便節點可以將該資訊傳播給後續連線到它的其他節點。

有關 advertise 位址的更多詳細資訊,請參閱 docker swarm init CLI 參考

檢視加入指令或更新 swarm 加入權杖

節點需要一個密鑰才能加入 Swarm。工作節點的密鑰與管理節點的密鑰不同。節點僅在加入 Swarm 時使用加入密鑰。在節點已加入 Swarm 後輪替加入密鑰不會影響節點的 Swarm 成員資格。密鑰輪替可確保任何嘗試加入 Swarm 的新節點無法使用舊密鑰。

要擷取包含工作節點加入密鑰的加入指令,請執行:

$ docker swarm join-token worker

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

    docker swarm join \
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377

This node joined a swarm as a worker.

要檢視管理節點的加入指令和密鑰,請執行:

$ docker swarm join-token manager

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

    docker swarm join \
    --token SWMTKN-1-59egwe8qangbzbqb3ryawxzk3jn97ifahlsrw01yar60pmkr90-bdjfnkcflhooyafetgjod97sz \
    192.168.99.100:2377

傳遞 --quiet 旗標僅列印密鑰。

$ docker swarm join-token --quiet worker

SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c

請小心處理加入密鑰,因為它們是加入 Swarm 的必要機密。特別是,將機密簽入版本控制是不良做法,因為它允許任何有權存取應用程式原始碼的人將新節點新增到 Swarm。管理節點密鑰尤其敏感,因為它們允許新的管理節點加入並取得對整個 Swarm 的控制權。

建議您在下列情況下輪替加入密鑰:

  • 如果密鑰意外簽入版本控制系統、群組聊天或意外列印到您的記錄檔中。
  • 如果您懷疑節點已遭到入侵。
  • 如果您希望確保沒有新的節點可以加入 Swarm。

此外,最佳做法是為任何機密(包括 Swarm 加入密鑰)實施定期輪替排程。建議您至少每 6 個月輪替一次密鑰。

執行 swarm join-token --rotate 以使舊密鑰失效並產生新密鑰。指定您是要輪替 workermanager 節點的密鑰。

$ docker swarm join-token  --rotate worker

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

    docker swarm join \
    --token SWMTKN-1-2kscvs0zuymrsc9t0ocyy1rdns9dhaodvpl639j2bqx55uptag-ebmn5u927reawo27s3azntd44 \
    192.168.99.100:2377

深入瞭解