Swarm 模式關鍵概念

本主題介紹 Docker Engine 1.12 的叢集管理和編排功能獨有的一些概念。

什麼是 swarm?

Docker Engine 中嵌入的叢集管理和編排功能是使用 swarmkit 構建的。Swarmkit 是一個獨立的專案,它實現了 Docker 的編排層,並直接在 Docker 內部使用。

一個 swarm 由多個在 Swarm 模式下執行的 Docker 主機組成,這些主機扮演著管理成員關係和委派的管理節點 (manager),以及執行swarm 服務的工作節點 (worker)。一個給定的 Docker 主機可以是一個管理節點、一個工作節點,或者同時扮演兩種角色。當您建立一個服務時,您需要定義其最佳狀態——副本數量、可用的網路和儲存資源、服務向外部世界暴露的埠等等。Docker 致力於維護該期望狀態。例如,如果一個工作節點變得不可用,Docker 會將該節點的任務排程到其他節點上。任務是一個執行中的容器,它是一個 swarm 服務的一部分,並由 swarm 管理器管理,而不是一個獨立的容器。

swarm 服務相對於獨立容器的一個關鍵優勢是,您可以修改服務的配置,包括其連線的網路和卷,而無需手動重啟服務。Docker 將更新配置,停止配置過時的服務任務,並建立符合期望配置的新任務。

當 Docker 在 Swarm 模式下執行時,您仍然可以在參與 swarm 的任何 Docker 主機上執行獨立容器以及 swarm 服務。獨立容器和 swarm 服務之間的一個關鍵區別是,只有 swarm 管理器可以管理 swarm,而獨立容器可以在任何守護程序上啟動。Docker 守護程序可以作為管理節點、工作節點或兩者兼具的角色參與 swarm。

就像您可以使用 Docker Compose 來定義和執行容器一樣,您也可以定義和執行 Swarm 服務棧。

請繼續閱讀,瞭解有關 Docker swarm 服務的概念詳情,包括節點、服務、任務和負載均衡。

節點

一個節點是參與 swarm 的 Docker 引擎例項。您也可以將其視為一個 Docker 節點。您可以在一臺物理計算機或雲伺服器上執行一個或多個節點,但生產環境中的 swarm 部署通常包含分佈在多個物理機和雲機器上的 Docker 節點。

要將您的應用程式部署到 swarm 中,您需要向一個管理節點提交服務定義。管理節點將稱為任務的工作單元分派給工作節點。

管理節點還執行維護 swarm 期望狀態所需的編排和叢集管理功能。管理節點會選舉一個唯一的領導者 (leader) 來執行編排任務。

工作節點接收並執行從管理節點分派的任務。預設情況下,管理節點也作為工作節點執行服務,但您可以將它們配置為只執行管理任務,成為純管理節點。每個工作節點上都執行著一個代理 (agent),用於報告分配給它的任務。工作節點會通知管理節點其分配任務的當前狀態,以便管理節點可以維護每個工作節點的期望狀態。

服務和任務

服務是在管理節點或工作節點上執行任務的定義。它是 swarm 系統的核心結構,也是使用者與 swarm 互動的主要根源。

當您建立一個服務時,您需要指定使用哪個容器映象以及在執行的容器內執行哪些命令。

在副本服務模型 (replicated services model) 中,swarm 管理器會根據您在期望狀態中設定的規模,在節點之間分發特定數量的副本任務。

對於全域性服務 (global services),swarm 會在叢集中每個可用節點上為該服務執行一個任務。

任務 (task) 承載一個 Docker 容器以及在容器內執行的命令。它是 swarm 的原子排程單元。管理節點根據服務規模中設定的副本數量將任務分配給工作節點。一旦一個任務被分配給一個節點,它就不能移動到另一個節點。它只能在被分配的節點上執行或失敗。

負載均衡

swarm 管理器使用入口負載均衡 (ingress load balancing) 來向 swarm 外部暴露您希望提供的服務。swarm 管理器可以自動為服務分配一個已釋出埠 (published port),或者您可以為服務配置一個已釋出埠。您可以指定任何未使用的埠。如果您沒有指定埠,swarm 管理器會為服務分配一個 30000-32767 範圍內的埠。

外部元件,如雲負載均衡器,可以在叢集中任何節點的已釋出埠上訪問該服務,無論該節點當前是否正在執行該服務的任務。swarm 中的所有節點都會將入口連線路由到一個正在執行的任務例項。

Swarm 模式有一個內部 DNS 元件,它會自動為 swarm 中的每個服務分配一個 DNS 條目。swarm 管理器使用內部負載均衡 (internal load balancing) 來根據服務的 DNS 名稱在叢集內的服務之間分發請求。

下一步是什麼?