Appearance
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:latestConfigs 管理
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 数量 | 容忍失败数 | 说明 |
|---|---|---|
| 1 | 0 | 单点故障,不适合生产 |
| 3 | 1 | 最小高可用配置 |
| 5 | 2 | 推荐生产配置 |
| 7 | 3 | 大规模集群 |
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— manager1192.168.1.11— manager2192.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 集群管理要点:
- 高可用:使用奇数个 Manager(至少 3 个)
- 扩缩容:
docker service scale快速调整副本数 - 滚动更新:配置合理的 parallelism 和 delay
- 节点维护:先 drain 再维护,维护后恢复 active
- Configs/Secrets:集中管理配置和密钥,避免硬编码