

























在生产环境中,服务的高可用性往往是一个必要但复杂的需求。传统的容器化高可用部署面临着不少挑战,今天来介绍一个针对 Docker Swarm 设计的 Keepalived Operator,看看它如何简化虚拟 IP 的管理工作。
在 Docker 和 Docker Swarm 环境下,实现高可用通常会遇到以下问题:
Docker Swarm Keepalived Operator 采用了 Operator 模式来解决这些问题:
整个系统采用控制器模式,分为两个主要组件:
运行在 Swarm Manager 节点,负责:
分布在标记的工作节点上:
这种分层设计的优势是职责分离,便于维护和扩展。
部署前先确认系统环境,主要是检查内核模块支持:
# 检查是否已加载 ip_vs 模块
lsmod | grep -P '^ip_vs\s'
# 如果没有输出,需要手动加载
echo "modprobe ip_vs" >> /etc/modules
modprobe ip_vs
# 验证加载成功
lsmod | grep ip_vs
注意:ip_vs 模块是 Linux 虚拟服务器的核心模块,Keepalived 需要它来实现负载均衡功能。
这一步是整个方案的核心 —— 通过 Docker 节点标签来告诉 Operator 哪些节点需要参与高可用:
# 基础标签配置:标记参与高可用的节点
docker node update web-01 --label-add keepalived_group=production
docker node update web-02 --label-add keepalived_group=production
docker node update web-03 --label-add keepalived_group=production
进阶配置:如果要精确控制 VRRP 优先级(推荐):
# 数值越高,成为 Master 的概率越大
docker node update web-01 --label-add KEEPALIVED_PRIORITY=102 # 首选主节点
docker node update web-02 --label-add KEEPALIVED_PRIORITY=101 # 备选主节点
docker node update web-03 --label-add KEEPALIVED_PRIORITY=100 # 普通备节点
标签说明:
keepalived_group=production:指定节点所属的高可用组KEEPALIVED_PRIORITY=102:设置 VRRP 优先级,数值越大优先级越高创建 keepalived-stack.yaml 配置文件,这是整个部署的"蓝图":
version: '3.8'
services:
keepalived_operator:
image: pubimgs/keepalived-swarm-operator:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- host
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
environment:
# 必需配置
KEEPALIVED_GROUP: "production"
KEEPALIVED_VIRTUAL_IPS: "192.168.1.100,192.168.1.101"
# 可选配置
KEEPALIVED_INTERFACE: "eth0"
KEEPALIVED_PASSWORD: "MySecurePassword123"
KEEPALIVED_ROUTER_ID: "51"
networks:
host:
external: true
name: host
# 部署 Keepalived Operator
docker stack deploy -c keepalived-stack.yaml keepalived
# 查看部署状态
docker service ls --filter name=keepalived
# 查看 Operator 工作日志
docker service logs -f keepalived_keepalived_operator
部署完成后,Operator 会自动执行以下操作:
keepalived_group=production 标签的节点在同一个集群中可以通过不同的组标签实现环境隔离:
# 生产环境集群
docker node update prod-01 --label-add keepalived_group=production
docker node update prod-02 --label-add keepalived_group=production
# 测试环境集群
docker node update test-01 --label-add keepalived_group=staging
docker node update test-02 --label-add keepalived_group=staging
# 开发环境集群
docker node update dev-01 --label-add keepalived_group=development
docker node update dev-02 --label-add keepalived_group=development
然后部署不同的 Operator 实例,每个管理对应的环境,使用独立的虚拟 IP 段实现隔离。
Operator 的一个重要特性是支持动态扩缩容,集群节点变化时无需手动干预:
# 集群扩容:新节点加入高可用组
docker node update new-web-04 --label-add keepalived_group=production
# Operator 会发现新节点,自动创建 Keepalived 服务
# 集群缩容:节点退出高可用组
docker node update old-web-01 --label-rm keepalived_group
# Operator 会自动清理对应的 Keepalived 服务
# 临时维护:暂时移除节点
docker node update web-02 --label-rm keepalived_group
# 维护完成后重新加入
docker node update web-02 --label-add keepalived_group=production
整个过程中,其他节点的服务不受影响,虚拟 IP 会自动重新选举。
合理的优先级设计能让故障切换更加符合业务预期:
** 按数据中心分层**:
** 按性能分层**:
# 实例:三地三中心部署
docker node update beijing-web-01 --label-add KEEPALIVED_PRIORITY=115 # 主中心
docker node update shanghai-web-01 --label-add KEEPALIVED_PRIORITY=105 # 同城备份
docker node update guangzhou-web-01 --label-add KEEPALIVED_PRIORITY=95 # 异地备份
建议:优先级差距保持 5-10 比较合理,既能体现优先顺序,又避免过度集中。
建立日常巡检习惯,及时发现问题:
# 1. 检查 Operator 运行状态和日志
docker service logs -f keepalived_keepalived_operator
# 2. 查看集群中所有 Keepalived 服务
docker service ls --filter name=keepalived-node
# 3. 检查具体节点服务详情
docker service logs keepalived-node-web-01-1 --tail 50
# 4. 查看服务分布情况
docker service ps $(docker service ls --filter name=keepalived-node -q)
确保虚拟 IP 正常工作的检查清单:
# 基础连通性测试
ping -c 3 192.168.1.100
# 查看虚拟 IP 当前绑定在哪个节点
ip addr show | grep "192.168.1.100"
# 从集群外部测试虚拟 IP 服务
curl -I http://192.168.1.100
# 检查 VRRP 协议状态
docker exec $(docker ps -q -f name=keepalived-node | head -1) ip addr show
某电商公司有 3 台 Web 服务器,需要对外提供统一访问入口:
# 步骤 1:节点标签配置
docker node update web-server-01 --label-add keepalived_group=frontend
docker node update web-server-02 --label-add keepalived_group=frontend
docker node update web-server-03 --label-add keepalived_group=frontend
# 步骤 2:优先级设置(主机房优先)
docker node update web-server-01 --label-add KEEPALIVED_PRIORITY=110 # 主机房
docker node update web-server-02 --label-add KEEPALIVED_PRIORITY=105 # 主机房
docker node update web-server-03 --label-add KEEPALIVED_PRIORITY=100 # 备机房
# 步骤 3:部署配置
KEEPALIVED_GROUP: "frontend"
KEEPALIVED_VIRTUAL_IPS: "192.168.1.200" # 用户访问的统一入口
效果:用户始终通过 192.168.1.200 访问服务,任意一台服务器故障都不影响用户访问。
MySQL 主从集群需要提供统一的写入入口:
# 配置数据库集群节点
docker node update mysql-master --label-add keepalived_group=database
docker node update mysql-master --label-add KEEPALIVED_PRIORITY=120 # 主库最高优先级
docker node update mysql-slave-01 --label-add keepalived_group=database
docker node update mysql-slave-01 --label-add KEEPALIVED_PRIORITY=110 # 首选备库
docker node update mysql-slave-02 --label-add keepalived_group=database
docker node update mysql-slave-02 --label-add KEEPALIVED_PRIORITY=100 # 备选备库
# 部署配置
KEEPALIVED_GROUP: "database"
KEEPALIVED_VIRTUAL_IPS: "192.168.1.210" # 数据库统一写入入口
效果:应用程序连接 192.168.1.210 进行数据库操作,主库故障时自动切换到备库。
微服务架构下的 API 网关高可用部署:
# 多地域 API 网关部署
docker node update gateway-beijing-01 --label-add keepalived_group=api-gateway
docker node update gateway-beijing-01 --label-add KEEPALIVED_PRIORITY=115
docker node update gateway-shanghai-01 --label-add keepalived_group=api-gateway
docker node update gateway-shanghai-01 --label-add KEEPALIVED_PRIORITY=105
# 部署配置支持多个虚拟 IP
KEEPALIVED_GROUP: "api-gateway"
KEEPALIVED_VIRTUAL_IPS: "192.168.1.220,192.168.1.221" # 内外网双入口
Docker Swarm Keepalived Operator 提供了一种相对简化的高可用部署方案,通过 Operator 模式自动化了传统 Keepalived 的配置和管理工作。
与传统部署方式相比:
这个方案比较适合:
总体来说,这是一个实用的工具,可以在一定程度上简化 Docker Swarm 环境下的高可用部署工作。
pubimgs/keepalived-swarm-operator:latest如果这篇文章对你有帮助,别忘了给项目点个 ⭐ Star!
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。