在之前的小节,所有的节点的状态都是运行着的可用状态。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 状态时候,它能够重新收到如下的任务分配:
- 服务更新扩容
- 滚动更新
- 当你设置别的节点为drain
- 当另外一个节点上面的任务运行失败
时间: 2024-10-12 04:17:30