在生产环境中,服务的高可用性往往是一个必要但复杂的需求。传统的容器化高可用部署面临着不少挑战,今天来介绍一个针对 Docker Swarm 设计的 Keepalived Operator,看看它如何简化虚拟 IP 的管理工作。

传统部署方式的挑战

在 Docker 和 Docker Swarm 环境下,实现高可用通常会遇到以下问题:

原生 Docker 部署的不足

  • 手动配置复杂:需要在每个节点单独配置 Keepalived
  • 配置文件管理困难:多节点间配置同步容易出错
  • 缺乏动态感知:节点变化时需要手动修改所有相关配置
  • 监控分散:各节点日志和状态检查需要逐一处理

Docker Swarm 原生限制

  • 服务发现局限:Swarm 内建的负载均衡无法提供固定的外部 IP
  • 故障切换不透明:依赖外部负载均衡器,增加架构复杂度
  • 跨主机网络复杂:需要额外配置 overlay 网络和路由规则

Operator 方案的改进

Docker Swarm Keepalived Operator 采用了 Operator 模式来解决这些问题:

  • 自动节点发现:通过 Docker 标签识别目标节点
  • 配置自动生成:根据集群状态自动生成 Keepalived 配置
  • 动态服务管理:节点变化时自动创建或删除服务
  • 集中化监控:统一的日志和状态管理

架构设计

整个系统采用控制器模式,分为两个主要组件:

控制层(Operator)

运行在 Swarm Manager 节点,负责:

  • 节点监控:持续监控节点标签和状态变化
  • 服务管理:根据标签变化创建、更新或删除 Keepalived 服务
  • 配置生成:自动生成集群拓扑对应的 Keepalived 配置
  • 异常处理:检测到服务异常时进行恢复

执行层(Keepalived 实例)

分布在标记的工作节点上:

  • VRRP 协议:处理虚拟 IP 的选举和切换
  • 健康检查:监控本地服务状态
  • 故障转移:在检测到故障时快速切换

这种分层设计的优势是职责分离,便于维护和扩展。

三步完成部署

步骤一:系统环境检查

部署前先确认系统环境,主要是检查内核模块支持:

# 检查是否已加载 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 会自动执行以下操作:

  1. 发现所有带 keepalived_group=production 标签的节点
  2. 为每个节点创建对应的 Keepalived 服务
  3. 生成集群配置和节点通信列表
  4. 开始持续监控服务状态

进阶使用技巧

多环境部署

在同一个集群中可以通过不同的组标签实现环境隔离:

# 生产环境集群
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 会自动重新选举。

优先级策略最佳实践

合理的优先级设计能让故障切换更加符合业务预期:

** 按数据中心分层**:

  • 主数据中心:优先级 110-120(优先承载流量)
  • 同城灾备:优先级 100-110(次优选择)
  • 异地灾备:优先级 90-100(最后选择)

** 按性能分层**:

  • 高性能节点:优先级 110-120
  • 标准节点:优先级 100-110
  • 低配节点:优先级 90-100
# 实例:三地三中心部署
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 健康验证

确保虚拟 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 网关高可用部署:

# 多地域 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 的配置和管理工作。

主要优势

与传统部署方式相比:

  • 减少了手动配置工作量
  • 支持集群动态变化
  • 提供统一的管理界面
  • 降低了配置出错的可能性

适用场景

这个方案比较适合:

  • 需要快速部署高可用服务的团队
  • 希望简化 Keepalived 运维工作的场景
  • Docker Swarm 环境下的虚拟 IP 管理需求

使用建议

  1. 在测试环境先熟悉操作流程
  2. 了解 VRRP 协议和 Keepalived 的工作原理
  3. 根据实际网络环境调整配置参数
  4. 建立相应的监控和告警机制

总体来说,这是一个实用的工具,可以在一定程度上简化 Docker Swarm 环境下的高可用部署工作。

相关资源


如果这篇文章对你有帮助,别忘了给项目点个 Star!

Docker Swarm Keepalived Operator:高可用集群虚拟 IP 管理方案的更多相关文章

  1. LVS+Keepalived实现高可用集群

    LVS+Keepalived实现高可用集群来源: ChinaUnix博客 日期: 2009.07.21 14:49 (共有条评论) 我要评论 操作系统平台:CentOS5.2软件:LVS+keepal ...

  2. 集群相关、用keepalived配置高可用集群

    1.集群相关 2.keepalived相关 3.用keepalived配置高可用集群 安装:yum install keepalived -y   高可用,主要是针对于服务器硬件或服务器上的应用服务而 ...

  3. Linux centosVMware 集群介绍、keepalived介绍、用keepalived配置高可用集群

    一.集群介绍 根据功能划分为两大类:高可用和负载均衡 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 实现高可用的开源软件有:heartbeat. ...

  4. Nginx(四):Keepalived+Nginx 高可用集群

    Keepalived+Nginx 高可用集群 (主从模式) 集群架构图 安装keepalived [root@localhost ~]# yum install -y keepalived 查看状态 ...

  5. rabbitmq+ keepalived+haproxy高可用集群详细命令

    公司要用rabbitmq研究了两周,特把 rabbitmq 高可用的研究成果备下 后续会更新封装的类库 安装erlang wget http://www.gelou.me/yum/erlang-18. ...

  6. rabbitmq+haproxy+keepalived实现高可用集群搭建

    项目需要搭建rabbitmq的高可用集群,最近在学习搭建过程,在这里记录下可以跟大家一起互相交流(这里只是记录了学习之后自己的搭建过程,许多原理的东西没有细说). 搭建环境 CentOS7 64位 R ...

  7. 集群介绍 keepalived介绍 用keepalived配置高可用集群

    集群介绍 • 根据功能划分为两大类:高可用和负载均衡 • 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 • 实现高可用的开源软件有:heartb ...

  8. Keepalived+Nginx高可用集群

    Keepalived简介 Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替 ...

  9. keepalived+MySQL高可用集群

    基于keepalived搭建MySQL的高可用集群   MySQL的高可用方案一般有如下几种: keepalived+双主,MHA,MMM,Heartbeat+DRBD,PXC,Galera Clus ...

  10. keepalived+nginx 高可用集群

    一.什么是高可用?   nginx做负载均衡,能达到分发请求的目的,但是不能很好的避免单点故障. 1.nginx集群单点问题 分发器宕机怎么处理? 假如nginx服务器挂掉了,那么所有的服务也会跟着瘫 ...

随机推荐

  1. File与IO流之字节流

    FileOutputStream 创建字节输出流对象FileOutputStream fl =new FileOutputStream() 传入的参数可以是字符串路径或者File对象(实际上如果传入字 ...

  2. python代码片段

    输入分钟.秒,输出格式为:  hh:mm:ss 代码实现: import datetime def convert_to_hh_mm_ss(minutes, seconds): total_secon ...

  3. 什么?AI还是儿童百科全书呢

    本文由 ChatMoney团队出品 介绍说明 在孩子充满好奇与探索欲望的成长道路上,知识是他们最宝贵的财富.而我们的儿童百科全书智能体,就像一座知识的宝库,为孩子们打开了一扇通往世界的神奇大门. 儿童 ...

  4. PHP数据结构当中的队列

    本文由 ChatMoney团队出品 队列是一种基本的数据结构,遵循先进先出(FIFO, First In First Out)原则,即最先添加的元素将是最先被移除的.在本篇文章中,我们将深入探讨队列的 ...

  5. ABAP中字符串相关比较

    The following table shows the relational operators for comparisons between character-like operands ( ...

  6. MobiSys'2022 CoDL论文详解

    算子切分 在了解算子切分前,先了解一下卷积的运算过程,作者将算子切分分为了两个维度的切分:OC维度和H维度,没有W维度可能与数据在内存中的存储方式有关. OC维度切分 卷积就是OC数量个kernel_ ...

  7. oracle 存储过程 for loop 定时任务

    记录. 是这么个事,要实现一个需求,当人员表里的数据有更新后需要告知其他系统更新他们自己的人员数据. 我想了一下,表里是有时间戳字段的,那我只要监听这个时间就行,拿到数据后用存储过程把数据插入到中间表 ...

  8. Edge 突然显示网站“不安全”的一个处理办法。

    Edge浏览器升级后,访问以前可以正常访问的网站,地址栏前红色提示"不安全",网页无法访问,一会弹出来提示说"证书可能未被验证". 在我们确认该网站是正常的情况 ...

  9. C# 深拷贝(新赋值对象不使用原来的对象内存地址)

    https://www.cnblogs.com/profession/p/6222489.html //四种深拷贝方法 public static T DeepCopyByReflect<T&g ...

  10. CF2064F We Be Summing 题解

    CF2064F We Be Summing 计数问题通常需要对计数对象找到一个独一无二的特征进行计数,否则只能进行容斥.注意到一个子区间中 \(i\) 从左到右的过程中,前一部分 \(\min\) 单 ...