清空 swarm 上的節點


在本教程的前面步驟中,所有節點都以 Active(活躍)可用性狀態執行。叢集管理器可以將任務分配給任何 Active 節點,因此到目前為止,所有節點都可用於接收任務。

有時,例如在計劃維護期間,您需要將節點的可用性設定為 Drain(排空)。Drain 可用性會阻止節點從叢集管理器接收新任務。這也意味著管理器會停止在該節點上執行的任務,並在具有 Active 可用性的節點上啟動副本任務。

重要

將節點設定為 Drain 不會從該節點移除獨立容器,例如使用 docker rundocker compose up 或 Docker 引擎 API 建立的容器。節點的任何狀態,包括 Drain,僅影響該節點排程叢集服務工作負載的能力。

  1. 如果你還沒有這樣做,請開啟一個終端並透過 ssh 連線到你執行管理器節點的機器。例如,本教程使用一臺名為 manager1 的機器。

  2. 驗證您的所有節點是否都處於活躍可用狀態。

    $ docker node ls
    
    ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    1bcef6utixb0l0ca7gxuivsj0    worker2   Ready   Active
    38ciaotwjuritcdtn9npbnkuz    worker1   Ready   Active
    e216jshn25ckzbvmwlnh5jr3g *  manager1  Ready   Active        Leader
    
  3. 如果您沒有在執行滾動更新教程中的 redis 服務,請立即啟動它。

    $ docker service create --replicas 3 --name redis --update-delay 10s redis:7.4.0
    
    c5uo6kdmzpon37mgj9mwglcfw
    
  4. 執行 docker service ps redis 檢視叢集管理器如何將任務分配給不同的節點。

    $ docker service ps redis
    
    NAME                               IMAGE        NODE     DESIRED STATE  CURRENT STATE
    redis.1.7q92v0nr1hcgts2amcjyqg3pq  redis:7.4.0  manager1 Running        Running 26 seconds
    redis.2.7h2l8h3q3wqy5f66hlv9ddmi6  redis:7.4.0  worker1  Running        Running 26 seconds
    redis.3.9bg7cezvedmkgg6c8yzvbhwsd  redis:7.4.0  worker2  Running        Running 26 seconds
    

    在這種情況下,叢集管理器將一個任務分配給了每個節點。您可能會看到在您的環境中,任務在節點間的分配有所不同。

  5. 執行 docker node update --availability drain <NODE-ID> 來排空一個分配了任務的節點。

    $ docker node update --availability drain worker1
    
    worker1
    
  6. 檢查該節點以檢視其可用性。

    $ docker node inspect --pretty worker1
    
    ID:			38ciaotwjuritcdtn9npbnkuz
    Hostname:		worker1
    Status:
     State:			Ready
     Availability:		Drain
    ...snip...
    

    被排空的節點在 Availability(可用性)一欄顯示為 Drain

  7. 執行 docker service ps redis 檢視叢集管理器如何更新 redis 服務的任務分配。

    $ docker service ps redis
    
    NAME                                    IMAGE        NODE      DESIRED STATE  CURRENT STATE           ERROR
    redis.1.7q92v0nr1hcgts2amcjyqg3pq       redis:7.4.0  manager1  Running        Running 4 minutes
    redis.2.b4hovzed7id8irg1to42egue8       redis:7.4.0  worker2   Running        Running About a minute
     \_ redis.2.7h2l8h3q3wqy5f66hlv9ddmi6   redis:7.4.0  worker1   Shutdown       Shutdown 2 minutes ago
    redis.3.9bg7cezvedmkgg6c8yzvbhwsd       redis:7.4.0  worker2   Running        Running 4 minutes
    

    叢集管理器透過結束在 Drain 可用性節點上的任務,並在 Active 可用性節點上建立一個新任務來維持所需狀態。

  8. 執行 docker node update --availability active <NODE-ID> 將排空的節點恢復到活躍狀態。

    $ docker node update --availability active worker1
    
    worker1
    
  9. 檢查該節點以檢視更新後的狀態。

    $ docker node inspect --pretty worker1
    
    ID:			38ciaotwjuritcdtn9npbnkuz
    Hostname:		worker1
    Status:
     State:			Ready
     Availability:		Active
    ...snip...
    

    當您將節點設定回 Active 可用性時,它可以接收新任務:

    • 在服務更新以進行擴容時
    • 在滾動更新期間
    • 當您將另一個節點設定為 Drain 可用性時
    • 當另一個活躍節點上的任務失敗時

後續步驟

接下來,您將學習如何使用 Swarm 模式的路由網格。

使用 Swarm 模式路由網格