在之前的章节,所以的节点状态都为ACTIVE了。swarm管理器能分配任务到任何ACTIVE的节点,所以目前为止所有的节点都可以接收任务。
不过有时候如维护期间,你需要设置一个节点为DRAIN状态,也就是下线节点。DRAIN状态的节点不再接受来自swarm管理器发来的新任务。也意味着管理器停止DRAIN状态节点的任务然后再在ACTIVE节点上新起一个副本任务来替代之前的任务。
1.登录manager1机器。
2.查看目前所有的节点都为Active状态。
- $ 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:3.0.6
-
- c5uo6kdmzpon37mgj9mwglcfw
4.执行docker service ps redis查看swarm管理器把任务分配到了哪些节点:
- $ docker service ps redis
-
- ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
- 7q92v0nr1hcgts2amcjyqg3pq redis.1 redis redis:3.0.6 Running 26 seconds Running manager1
- 7h2l8h3q3wqy5f66hlv9ddmi6 redis.2 redis redis:3.0.6 Running 26 seconds Running worker1
- 9bg7cezvedmkgg6c8yzvbhwsd redis.3 redis redis:3.0.6 Running 26 seconds Running worker2
在这个示例中,swarm管理器为每个节点分配一个任务。
5.执行docker node update –availability drain 来下线一个节点:
- docker node update --availability drain worker1
-
- worker1
6.查看这个节点的状态:
- $ docker node inspect --pretty worker1
-
- ID: 38ciaotwjuritcdtn9npbnkuz
- Hostname: worker1
- Status:
- State: Ready
- Availability: Drain
- ...snip...
下线的节点显示Drain状态。
7.执行docker service ps redis来查看swarm管理器是如何重新分配redis任务到其它可用节点的:
- $ docker service ps redis
-
- ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
- 7q92v0nr1hcgts2amcjyqg3pq redis.1 redis:3.0.6 manager1 Running Running 4 minutes
- b4hovzed7id8irg1to42egue8 redis.2 redis:3.0.6 worker2 Running Running About a minute
- 7h2l8h3q3wqy5f66hlv9ddmi6 \_ redis.2 redis:3.0.6 worker1 Shutdown Shutdown 2 minutes ago
- 9bg7cezvedmkgg6c8yzvbhwsd redis.3 redis:3.0.6 worker2 Running Running 4 minutes
swarm管理器停止已下线节点的redis任务并在其它Active节点创建一个新任务来维持设定redis副本数。
8.执行docker node update –availability active 来上线已下线的节点:
- $ 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状态时
当一个任务在另一个Active节点失败时