Skip to content

Swarm 集群管理

本节介绍 Docker Swarm 集群的运维管理,包括扩缩容、滚动更新、节点维护等。

服务扩缩容

bash
# 扩展服务副本数
docker service scale web=5 api=3

# 缩减副本数
docker service scale web=1

# 查看扩缩容结果
docker service ps web

滚动更新

滚动更新允许在不停机的情况下更新服务:

bash
# 基本滚动更新(更新镜像版本)
docker service update \
  --image myapp:v2 \
  --update-parallelism 1 \    # 每次更新 1 个副本
  --update-delay 10s \         # 更新间隔
  myapp-service

# 更多更新配置
docker service update \
  --image myapp:v2 \
  --update-parallelism 2 \
  --update-delay 30s \
  --update-failure-action rollback \   # 失败自动回滚
  --update-monitor 15s \               # 更新后监控时间
  --update-max-failure-ratio 0.1 \     # 失败率超过 10% 则停止
  myapp-service

回滚服务

bash
# 回滚到上一版本
docker service rollback myapp-service

# 配置自动回滚策略
docker service update \
  --rollback-parallelism 2 \
  --rollback-delay 10s \
  --rollback-failure-action pause \
  myapp-service

节点维护

排空节点(维护模式)

bash
# 将节点设为 drain(排空所有任务,不接受新任务)
docker node update --availability drain worker1

# 等待任务迁移完成
docker node ps worker1  # 查看该节点还有哪些任务

# 维护完成后恢复
docker node update --availability active worker1

节点标签管理

bash
# 添加标签
docker node update --label-add zone=us-east worker1
docker node update --label-add ssd=true worker2
docker node update --label-add gpu=nvidia worker3

# 查看节点标签
docker node inspect worker1 --format '{{json .Spec.Labels}}'

# 删除标签
docker node update --label-rm zone worker1

基于标签的服务放置

bash
# 只在有 SSD 的节点上运行数据库
docker service update \
  --constraint-add "node.labels.ssd==true" \
  postgres-service

# 在生产节点集上运行
docker service create \
  --name prod-api \
  --constraint "node.labels.env==production" \
  --replicas 3 \
  myapi:latest

Configs 管理

Swarm Configs 用于将配置文件安全地分发到服务中:

bash
# 创建配置
docker config create nginx_conf ./nginx.conf

# 列出配置
docker config ls

# 查看配置内容
docker config inspect nginx_conf --pretty

# 在服务中使用配置
docker service create \
  --name web \
  --config source=nginx_conf,target=/etc/nginx/nginx.conf \
  nginx:alpine

# 更新配置(需要先创建新版本,再更新服务)
docker config create nginx_conf_v2 ./nginx_v2.conf

docker service update \
  --config-rm nginx_conf \
  --config-add source=nginx_conf_v2,target=/etc/nginx/nginx.conf \
  web

# 删除配置
docker config rm nginx_conf

监控集群状态

bash
# 查看集群概览
docker node ls
docker service ls

# 查看特定服务的所有任务
docker service ps myapp --no-trunc

# 查看失败的任务
docker service ps myapp --filter "desired-state=shutdown"

# 查看服务日志
docker service logs -f myapp

# 查看特定节点上的任务
docker node ps worker1

# 实时监控资源
docker stats $(docker ps -q)

集群高可用配置

Manager 节点数量

Manager 数量容忍失败数说明
10单点故障,不适合生产
31最小高可用配置
52推荐生产配置
73大规模集群

Raft 共识算法要求超过半数 Manager 在线才能做决策。

集群锁定(防止脑裂)

bash
# 开启自动锁定(Manager 重启后需要输入密钥)
docker swarm update --autolock=true

# 保存输出的解锁密钥!
# Swarm updated.
# To unlock a swarm manager after it restarts, run the `docker swarm unlock` command
# and provide the following key:
# SWMKEY-1-xxxx

# Manager 重启后解锁
docker swarm unlock
# 输入保存的密钥

# 查看当前解锁密钥
docker swarm unlock-key

# 轮换解锁密钥
docker swarm unlock-key --rotate

负载均衡

Swarm 内置两种负载均衡:

Ingress 网络(默认)

bash
# 服务的所有入口流量通过 ingress 网络路由
docker service create \
  --name web \
  --publish mode=ingress,published=80,target=80 \
  --replicas 3 \
  nginx

# 访问集群中任意节点的 80 端口,都会路由到某个副本

Host 模式端口

bash
# 每个副本直接绑定到运行节点的端口
docker service create \
  --name web \
  --publish mode=host,published=80,target=80 \
  --replicas 3 \
  nginx

实战:三节点集群搭建

假设三台服务器:

  • 192.168.1.10 — manager1
  • 192.168.1.11 — manager2
  • 192.168.1.12 — worker1
bash
# === 在 manager1 上 ===
docker swarm init --advertise-addr 192.168.1.10

# 获取 manager 加入命令
docker swarm join-token manager
# 复制输出的命令

# === 在 manager2 上 ===
docker swarm join --token SWMTKN-1-manager-token 192.168.1.10:2377

# 获取 worker 加入命令(回到 manager1)
docker swarm join-token worker

# === 在 worker1 上 ===
docker swarm join --token SWMTKN-1-worker-token 192.168.1.10:2377

# === 验证集群 ===
docker node ls
# ID              HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
# xxx *           manager1   Ready   Active        Leader
# yyy             manager2   Ready   Active        Reachable
# zzz             worker1    Ready   Active

# === 部署测试服务 ===
docker service create \
  --name web \
  --replicas 3 \
  --publish 80:80 \
  nginx

docker service ps web

总结

Swarm 集群管理要点:

  1. 高可用:使用奇数个 Manager(至少 3 个)
  2. 扩缩容docker service scale 快速调整副本数
  3. 滚动更新:配置合理的 parallelism 和 delay
  4. 节点维护:先 drain 再维护,维护后恢复 active
  5. Configs/Secrets:集中管理配置和密钥,避免硬编码