DRAIN状态的节点

之前讲述的内容,都是在所有的节点都是可用的,状态都是ACTIVE。因此,manager可以将任务分配到所有节点上,所以到目前位置所有的节点都可以接受manager分配的任务。

有的时候,例如计划系统维护时,我们需要将节点的状态变成DRAINDRAIN状态将阻止节点接收manager分配的任务。同时也意味着,manager将停止该节点上的task,并将task转移到其他ACTIVE状态的节点上运行。

  1. 通过ssh登录到manager节点。

  2. 查看我们有哪些ACTIVE状态的节点:

    1. $ docker node ls
    2. ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
    3. 1bcef6utixb0l0ca7gxuivsj0 worker2 Ready Active
    4. 38ciaotwjuritcdtn9npbnkuz worker1 Ready Active
    5. e216jshn25ckzbvmwlnh5jr3g * manager1 Ready Active Leader
  3. 部署一个redis服务:

    1. $ docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6
    2. c5uo6kdmzpon37mgj9mwglcfw
  4. 运行命令docker service ps redis查看task分配的情况:

    1. $ docker service ps redis
    2. NAME IMAGE NODE DESIRED STATE CURRENT STATE
    3. redis.1.7q92v0nr1hcgts2amcjyqg3pq redis:3.0.6 manager1 Running Running 26 seconds
    4. redis.2.7h2l8h3q3wqy5f66hlv9ddmi6 redis:3.0.6 worker1 Running Running 26 seconds
    5. redis.3.9bg7cezvedmkgg6c8yzvbhwsd redis:3.0.6 worker2 Running Running 26 seconds

    我们看见每一个node上都被分配了一个task。由于实际实验环境不同,也可能并不是这样分配的。

  5. 运行命令docker node update --availability drain <NODE-ID>将节点状态设置为DRAIN

    1. docker node update --availability drain worker1
    2. worker1
  6. 检查节点状态:

    1. $ docker node inspect --pretty worker1
    2. ID: 38ciaotwjuritcdtn9npbnkuz
    3. Hostname: worker1
    4. Status:
    5. State: Ready
    6. Availability: Drain
    7. ...snip...

    这里已经完成节点DRAIN状态的变更。

  7. 运行命令docker service ps redis查看manager如何将task重新分配:

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

    manager为了使redis的状态保持跟最初设定一致,将DRAIN状态节点上的task转移到一个ACTIVE状态的节点上运行。

  8. 运行命令docker node update --availability active <NODE-ID>使节点状态变回到ACTIVE

    1. $ docker node update --availability active worker1
    2. worker1
  9. 检查节点状态。

    1. $ docker node inspect --pretty worker1
    2. ID: 38ciaotwjuritcdtn9npbnkuz
    3. Hostname: worker1
    4. Status:
    5. State: Ready
    6. Availability: Active
    7. ...snip...

    节点状态变回到ACTIVE后,就可以在如下情况时接受manager分配创建task。

    • 增加service中task数量
    • 滚动式更新时
    • 其他节点状态变为DRAIN
    • 其他节点的task运行失败时。