1. 程式人生 > 其它 >11 Docker Swarm

11 Docker Swarm

11 Docker Swarm

11.1 簡介

Docker引擎的叢集,稱為swarm。swarm由一個或多個節點組成,節點主要有兩種型別:管理節點和工作節點,主要分為以下概念

  • Swarm: 叢集的管理和編排是使用嵌入docker引擎的SwarmKit,可以在docker 初始化時啟動swarm模式或者加入已存在的swarm

  • Node:

    一個節點是Docker引擎叢集的一個例項,可以將其視為Docker節點,在單個物理伺服器或雲伺服器上執行一個或多個節點,但生成環境部署通常包含分佈在多個物理和雲服上的Docker節點。

    將應用程式部署到swarm,將服務定義提交給管理器節點,管理器節點將成為任務的工作單元分配到工作節點

  • Service:

    一個服務是任務的定義,管理機或工作節點上執行。他是群體系統的中心結構,是使用者與群體互動的主要根源。建立服務時,你需要制定要使用的容器映象。

  • Task:

    任務是在Docker 容器中執行的命令,manager節點根據制定數量的任務副本分給任務給worker 節點

Raft協議: 一致性演算法,保證大多數節點存活,才可以使用,高可用(詳情請參考“Raft協議”介紹)

11.2 節點概述

管理節點:

  • 維持叢集狀態

  • 排程服務

  • 服務群模式HTTP API端點

使用Raft實現,管理人員可以維護整個swarm群集及其上執行的所有服務的一致內部狀態。出於測試,可以由一個管理器執行一個叢集。如果單個管理器群中的管理器發生故障,那麼服務將繼續執行,但是需要建立一個新的叢集以進行恢復。

為了利用群體模式的容錯功能,建議根據組織的高可用性要求實現奇數個節點。如果有多個管理器,則可以從管理器節點的故障中恢復,而無需停機。相關的建議如下:

  • 一個由三名manager組成的群體最多可以容忍一名manager的丟失。

  • 五個管理器群最多可以同時丟失兩個管理節點。

  • 一個N管理器群集最多可以容忍管理器的丟失 (N-1)/2。

  • 建議最多為七個管理節點。

工作節點:

工作節點也是Docker引擎的例項,其唯一目的是執行容器。工作節點不參與Raft分散式狀態,不做排程決策,也不服務於swarm模式的httpapi。

可以建立一個由一個管理節點組成的群,但是如果沒有至少一個管理器節點,就不能有一個工作節點。預設情況下,所有manager也是工作節點。在單個管理器節點叢集中,可以執行docker service create等命令,排程器將所有任務放在本地引擎上

要防止排程器將任務放置在多節點群中的管理器節點上,請將管理器節點的可用性設定為“Drain”。排程器在Drain模式下優雅地停止節點上的任務,並在活動節點上排程任務。排程程式不會將新任務分配給具有可用性的節點。

11.3 服務概述

服務通常是微服務的映像。服務示例可能包括HTTP伺服器,資料庫或您希望在分散式環境中執行的任何其他型別的可執行程式。

建立服務時,需要指定要使用的容器映像以及要在執行中的容器中執行的命令。也定義服務的選項,包括:

  • 群在群體外提供服務的埠

  • 用於服務連線到群中其他服務的覆蓋網路

  • CPU和記憶體限制與保留

  • 滾動更新策略

  • 群中要執行的影象的副本數

11.3.1 服務,任務和容器

將服務部署到群集時,群集管理節點接受服務定義作為服務的所需狀態。然後,將服務安排在群集中的節點上,作為一項或多項副本任務。任務在群集中的節點上彼此獨立執行。

示例,假設您要在HTTP偵聽器的三個例項之間實現負載平衡。下圖顯示了具有三個副本的HTTP偵聽器服務。偵聽器的三個例項中的每個例項都是叢集中的任務。

容器是一個孤立的過程。在群體模式模型中,每個任務僅呼叫一個容器。任務類似於排程程式在其中放置容器的“插槽”。一旦容器處於活動狀態,排程程式就會識別出該任務處於執行狀態。如果容器未通過執行狀況檢查或終止,則任務終止。

11.3.2 任務和計劃

任務是群內排程的基本單位。當您通過建立或更新服務來宣告所需的服務狀態時,協調器通過排程任務來實現所需的狀態。例如,您定義了一個服務,該服務指示協調器始終保持HTTP偵聽器的三個例項執行。協調器通過建立三個任務來做出響應。每個任務都是排程程式通過生成容器填充的插槽。容器是任務的例項。如果HTTP偵聽器任務隨後無法通過其執行狀況檢查或崩潰,那麼協調器將建立一個新的副本任務,該任務將生成一個新的容器。

任務是一種單向機制。它通過一系列狀態單調進行:已分配,已準備,正在執行等。如果任務失敗,協調器將刪除任務及其容器,然後根據服務指定的所需狀態建立一個新任務來替換它。

Docker群模式的基本邏輯是通用排程程式和協調器。服務和任務抽象本身並不知道它們實現的容器。假設地,您可以實現其他型別的任務,例如虛擬機器任務或非容器化過程任務。排程程式和協調程式與任務型別無關。但是,當前版本的Docker僅支援容器任務。

下圖顯示了群集模式如何接受服務建立請求以及如何將任務排程到工作者節點。

11.3.3 複製和全域性服務

服務部署有兩種型別,即複製的和全域性的。

對於複製的服務,您可以指定要執行的相同任務的數量。例如,您決定部署一個具有三個副本的HTTP服務,每個副本提供相同的內容。

全域性服務是在每個節點上執行一個任務的服務。沒有預先指定的任務數。每次將節點新增到群集時,協調器都會建立一個任務,排程程式會將任務分配給新節點。全域性服務的最佳選擇是監視代理,防病毒掃描程式或要在群集中每個節點上執行的其他型別的容器。

下圖以黃色顯示了三個服務的副本,以灰色顯示了全域性服務。

11.4 搭建叢集

伺服器名稱伺服器IP伺服器角色
master-01 192.168.5.3 manager
master-02 192.168.5.4 manager
node-01 192.168.5.5 node
node-02 192.168.5.6 node

建立叢集主要分為兩步

  1. 生成主節點

  2. 加入節點

11.4.1 初始化管理節點

docker swarm init --advertise-addr 192.168.5.3

11.4.2 加入工作節點

# 生成管理節點令牌
docker swarm join-token manager

# 生成工作節點令牌
docker swarm join-token worker

11.4.3 檢視叢集節點資訊

11.4.4 Swarm叢集彈性建立服務

# 啟動一個專案服務
docker service create -p 8888:80 --name my-nginx nginx

# 檢視服務
docker service ls
docker service ps my-nginx

# 更新服務副本數
docker service update --replicas 3 my-nginx

本文摘抄或總結其他筆記,筆記不涉及任何商業用途,如果侵權請及時聯絡處理