在之前的小节,所有的节点的状态都是运行着的可用状态。swarm manager 可以分配任务给任意可用的节点。


有时候,你可能需要对某台服务器进行维护,你需要配置某个节点为drain状态,即排干该节点上面的所有运行的容器。drain状态可以防止维护节点再收到 管理节点的指令。


它也意味着管理节点停止在该服务器上面运行任务,并把复制任务放到别的可用节点上面。

$ docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
1bcef6utixb0l0ca7gxuivsj0    worker2   Ready   Active
38ciaotwjuritcdtn9npbnkuz    worker1   Ready   Active
e216jshn25ckzbvmwlnh5jr3g *  manager1  Ready   Active        Leader


如果你不在运行redis3.0.7的镜像,回滚到原来的redis3.0.6,你可以执行以下命令

$ docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6
c5uo6kdmzpon37mgj9mwglcfw
$ docker service ps redis
NAME                               IMAGE        NODE     DESIRED STATE  CURRENT STATE
redis.1.7q92v0nr1hcgts2amcjyqg3pq  redis:3.0.6  manager1 Running        Running 26 seconds
redis.2.7h2l8h3q3wqy5f66hlv9ddmi6  redis:3.0.6  worker1  Running        Running 26 seconds
redis.3.9bg7cezvedmkgg6c8yzvbhwsd  redis:3.0.6  worker2  Running        Running 26 seconds


当我们想要排干 worker1上面的容器,进行维护时


docker node update --availability drain <NODE-ID> 

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


可以看到  

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


swarm manager 会停止处于 drain状态的节点上面的容器,并重新在可用的节点上面启用该容器。


维护完毕,从drain状态恢复回  active 状态

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


当你设置一个维护的节点重新回到 active 状态时候,它能够重新收到如下的任务分配:


  1. 服务更新扩容

  2. 滚动更新

  3. 当你设置别的节点为drain

  4. 当另外一个节点上面的任务运行失败