Kubernetes 多集群与集群舰队管理实战

当单个 Kubernetes 集群已经无法同时满足地域隔离、故障域隔离、合规边界和团队自治要求时,多集群才真正有价值。多集群不是“多装几套 Kubernetes”,而是把集群本身当作一种可持续交付、可统一治理、可独立失效的基础设施产品。

本文从生产落地角度说明如何建立集群清单、统一交付应用与策略、设计跨集群流量、控制配置漂移,并给出升级、灾备和故障处置方法。重点不是某一个平台,而是一套可以迁移到不同产品上的舰队管理思路。

一、先判断是否真的需要多集群

适合采用多集群的典型情况包括:

  • 不同城市、可用区或数据中心需要独立故障域;
  • 生产、测试或不同安全等级必须进行强隔离;
  • 多个业务团队需要独立的升级窗口和资源配额;
  • 单集群规模已经逼近控制面、网络或运维团队的管理边界;
  • 业务要求异地容灾、就近接入或数据驻留;
  • 边缘节点多且网络不稳定,需要区域自治。

下面的问题不应仅靠增加集群掩盖:

  • 单集群内没有资源配额,团队互相争抢资源;
  • 监控、备份和升级流程尚未标准化;
  • 应用依赖本地磁盘、固定 IP 或人工发布;
  • 集群版本失控,插件和证书没有生命周期管理;
  • 没有定义恢复时间目标 RTO 和恢复点目标 RPO。

多集群会把已有的运维问题成倍放大。正确顺序通常是先把一套集群做成可复制的标准产品,再扩展为舰队。

二、常见管理模型

1. 完全独立

每个集群拥有独立的管理员、发布链路和监控体系。隔离性最好,但一致性差,适用于监管边界明确或不同组织完全自治的场景。

2. 中央管理、分散运行

管理集群维护集群注册、策略、应用模板和可观测性入口,工作负载仍在各成员集群独立运行。管理面故障时,成员集群应继续承载业务。

3. Hub-Spoke

中心集群作为 Hub,成员集群作为 Spoke。Hub 负责分发和汇总,Spoke 只保留必要代理。设计时必须避免 Hub 成为所有运行流量的必经点。

4. GitOps 舰队

Git 保存期望状态,控制器根据目录、标签或集群清单把应用分发到目标集群。它适合审计和回滚,也更容易控制配置漂移。

5. 调度型联邦

使用 Karmada 等平台把策略、资源和故障迁移抽象到多个集群之上。能力更强,但平台本身也需要高可用、升级和灾备,不应在缺少明确需求时过早引入。

常见组合是:Cluster API 管理集群生命周期,Argo CD ApplicationSet 管理应用交付,策略引擎管理安全基线,可观测平台汇总跨集群指标。

三、建立集群资产清单

每个集群至少应记录:

字段 示例 用途
集群标识 cn-sh-prod-01 全局唯一,不随显示名变化
环境 prod / staging 决定策略和发布审批
地域与故障域 上海 / AZ1 流量和容灾决策
Kubernetes 版本 1.xx 升级与兼容性判断
CNI/CSI/Ingress Cilium / Rook / Gateway 插件生命周期
Pod/Service CIDR 10.20.0.0/16 冲突检测
数据等级 公开 / 内部 / 敏感 合规和跨域限制
责任团队 platform-a 事件升级
维护窗口 周三 01:00 变更排期
备份状态 最近成功时间 恢复准备度
生命周期 建设中 / 运行 / 退役 防止遗留集群

建议为集群增加稳定标签:

metadata:
  labels:
    fleet.example.com/environment: production
    fleet.example.com/region: cn-shanghai
    fleet.example.com/tier: critical
    fleet.example.com/compliance: internal
    fleet.example.com/owner: platform-team

标签值应有受控字典和变更审计。不要把经常变化的人员姓名写入标签,也不要依赖自由文本决定生产发布。

四、用 Cluster API 管理集群生命周期

Cluster API 把集群、控制面和节点池表达为 Kubernetes API 对象。核心概念包括:

  • Management Cluster:保存集群声明并运行控制器;
  • Cluster:成员集群的总体声明;
  • Infrastructure Provider:云平台、虚拟化或裸金属资源;
  • Control Plane Provider:控制面生命周期;
  • MachineDeployment:可滚动更新的工作节点组;
  • Bootstrap Provider:节点初始化方式。

推荐流程:

  1. 维护经过验证的集群版本矩阵;
  2. 把网络、操作系统镜像、节点规格做成少量标准套餐;
  3. 新集群先进入预生产舰队,通过基线检查后再注册生产;
  4. 扩缩容、升级和退役均通过声明式变更完成;
  5. 管理集群的 etcd、凭据和 Provider 版本单独备份。

管理集群失效不应直接导致成员业务停止,但会影响扩容、升级和修复,因此也必须有明确 RTO 和恢复演练。

五、用 GitOps 分发应用

仓库可按平台基线、环境和集群覆盖项分层:

fleet-config/
├─ platform/
│  ├─ ingress/
│  ├─ observability/
│  └─ policy/
├─ environments/
│  ├─ production/
│  └─ staging/
├─ clusters/
│  ├─ cn-sh-prod-01/
│  └─ cn-bj-prod-01/
└─ applications/
   ├─ order-api/
   └─ portal/

ApplicationSet 可以按集群标签生成应用。例如仅向生产集群分发:

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: platform-production
spec:
  generators:
    - clusters:
        selector:
          matchLabels:
            fleet.example.com/environment: production
  template:
    metadata:
      name: '{{name}}-platform'
    spec:
      project: platform
      source:
        repoURL: https://git.example.com/platform/fleet-config.git
        targetRevision: main
        path: platform
      destination:
        server: '{{server}}'
        namespace: platform-system
      syncPolicy:
        automated:
          prune: true
          selfHeal: true

生产使用时还应增加:

  • Project 白名单限制仓库、目标集群和命名空间;
  • 对自动删除设置资源保护和人工审批边界;
  • 密钥通过 External Secrets、Vault 等系统注入,不进入 Git;
  • 对大规模同步设置批次和并发上限;
  • 为关键资源配置同步窗口;
  • 紧急人工修改记录为事件,并尽快回写期望状态。

六、身份与信任边界

最危险的设计是把一个长期有效、拥有所有集群最高权限的 kubeconfig 放在管理平台上。更稳妥的做法是:

  • 每个成员集群使用独立身份;
  • 只授予注册、读取或部署所需最小权限;
  • 优先使用短期令牌、OIDC 和工作负载身份;
  • 管理操作与应用发布使用不同账户;
  • 审计日志能够区分用户、流水线和控制器;
  • 凭据轮换不依赖重建整个集群;
  • 管理平台泄露时,可以逐集群吊销信任。

跨集群证书、服务网格根证书和镜像仓库凭据必须纳入统一生命周期管理。证书过期往往比节点故障更容易造成全舰队同时中断。

七、跨集群网络规划

1. 避免地址重叠

规划时至少检查 Pod CIDR、Service CIDR、节点网段、办公网、管理网、存储网,以及 VPN、专线和合作方地址。

如果未来需要直接跨集群路由,Pod CIDR 重叠会显著增加 NAT、排障和可观测性复杂度。即使当前没有互联,也应在 IPAM 中预留全局不重叠地址池。

2. 不把互通误认为高可用

跨集群网络连通只解决报文可达,还需考虑:

  • 服务发现和健康状态传播;
  • 网络时延、抖动、丢包和 MTU;
  • 双向身份认证;
  • 故障时流量撤回速度;
  • 数据库写入一致性;
  • 出站访问和审计边界。

3. 服务发现

常见方式包括全局 DNS、全局负载均衡、网关转发和服务网格多集群。对公网应用,通常由全局入口根据地域和健康状态分配到各集群;对内部服务,优先维持集群内调用,只有明确需要时才跨集群访问。

八、数据层决定真正的容灾能力

无状态应用可以在另一个集群快速拉起,但状态数据未必可用。多集群方案必须回答:

  • 数据是单主、多主还是只读副本?
  • RPO 是零、分钟级还是小时级?
  • 网络分区时谁可以写入?
  • 切换后如何防止旧主继续写入?
  • 对象存储、消息队列和缓存是否具备异地能力?
  • 恢复时如何验证数据完整性和业务语义?

不要让调度平台自动迁移一个不具备多地域一致性的数据库。恢复编排应把数据库、消息队列、密钥、配置和流量入口作为一个整体。

九、跨集群策略与配置漂移

常见基线包括命名空间、资源配额、Pod Security、镜像来源、NetworkPolicy、审计、日志、指标、Ingress/Gateway、DNS、证书和备份代理。

应把偏差分成三类:

  1. 允许差异:地域地址、存储类型、节点规格;
  2. 临时偏差:故障处置中的人工修改,应设置过期时间;
  3. 违规漂移:关闭审计、放开高危权限等,必须告警或阻断。

不要简单地把所有差异自动覆盖。对生产故障现场,强制回滚人工修复可能扩大事故,应提供暂停同步、记录原因和恢复托管的流程。

十、可观测性与舰队 SLO

集群健康

  • API Server 错误率与延迟;
  • etcd 空间、延迟、选主和碎片率;
  • 节点 Ready、磁盘、网络和证书状态;
  • DNS、CNI、CSI、Ingress/Gateway 健康;
  • 待调度 Pod 和资源碎片。

管理面健康

  • 集群注册和心跳延迟;
  • GitOps 同步成功率和排队时间;
  • 策略分发失败数量;
  • 凭据、证书到期时间;
  • 管理控制器队列深度和错误率。

业务健康

不要只看各集群 Pod 是否 Running,应使用统一业务 SLI,例如请求成功率、端到端延迟、交易完成率和数据新鲜度。

舰队层面可定义关键集群可管理率、配置同步及时率、版本合规率、备份成功率、恢复演练通过率和严重偏差修复时间。

十一、分批升级与版本治理

升级顺序可设计为实验集群、内部开发集群、预生产集群、一个低风险生产集群,再按地域或业务批次扩大,最后升级核心集群。

每一批都应设置停止条件:

  • API 错误率超过阈值;
  • CNI、CSI 或 Ingress 出现兼容问题;
  • 节点替换时间显著超出基线;
  • 关键业务 SLO 下降;
  • 新版本出现不可回滚的数据变更。

升级前确认 Kubernetes 版本跨度、废弃 API、Webhook、Operator、容器运行时、内核、CNI 和 CSI 的兼容矩阵。不要让所有集群在同一窗口升级。

十二、容灾切换演练

一次完整演练应包含:

  1. 宣布某个地域或集群不可用;
  2. 冻结自动发布,防止状态继续变化;
  3. 确认数据副本和恢复点;
  4. 在备用集群扩容应用;
  5. 切换密钥、依赖和消息消费;
  6. 调整 DNS 或全局负载均衡;
  7. 验证核心交易,而不仅是 HTTP 200;
  8. 观察错误率、延迟和积压;
  9. 决定是否回切,避免来回抖动;
  10. 记录实际 RTO、RPO 和人工步骤。

DNS 切换前要验证 TTL、递归缓存和客户端长连接。切换后仍需保留旧集群流量观测,以发现未迁移客户端。

十三、常见故障处置

管理集群不可用

确认成员业务是否独立运行;冻结危险变更;恢复管理集群 etcd、Provider 和密钥;避免同时新建第二套管理面接管相同资源。

成员集群失联

先区分 API 不可达、代理异常、凭据过期还是地域故障。不要因短暂网络抖动自动删除成员对象或把全部业务迁走。

GitOps 误删资源

立即暂停同步与自动删除;确认影响范围;从 Git 历史和备份恢复;对数据库、PVC 和证书配置额外删除保护。

全舰队证书接近过期

统计使用范围和依赖顺序,分批轮换根证书、中间证书和工作负载证书,保留双信任窗口,并监控握手错误。

跨集群网络分区

阻止双主写入,保持每个地域最小自治能力;确认全局入口撤回异常站点;恢复后先校验数据再回切。

十四、退役集群流程

  1. 停止新应用调度和新租户接入;
  2. 迁移业务、数据、密钥和外部依赖;
  3. 验证 DNS、监控和备份不再引用旧集群;
  4. 导出审计记录和必要配置;
  5. 撤销云凭据、证书和集群身份;
  6. 清理负载均衡、磁盘、快照和公网地址;
  7. 从 GitOps、CMDB、监控和告警中注销;
  8. 保留退役审批与数据销毁证据。

十五、生产检查清单

架构

  • [ ] 每个集群的业务边界和故障域明确;
  • [ ] 管理面故障不会直接中断成员业务;
  • [ ] 地址池无冲突,跨集群通信边界明确;
  • [ ] 状态数据有独立的复制与恢复设计。

安全

  • [ ] 没有共享的长期全局管理员 kubeconfig;
  • [ ] 所有控制器使用最小权限和可轮换身份;
  • [ ] 关键证书有到期告警和轮换演练;
  • [ ] 集群注册、发布和策略变更可审计。

交付与运维

  • [ ] 集群和插件有支持矩阵;
  • [ ] 应用按标签、环境和批次分发;
  • [ ] 自动同步、删除和人工接管边界清晰;
  • [ ] 有集群、管理面和业务三层 SLO;
  • [ ] 管理集群及 Git 仓库可恢复;
  • [ ] 升级使用金丝雀和停止条件;
  • [ ] 故障切换与集群退役均有演练记录。

参考资料

多集群的目标不是在一个控制台看到更多集群,而是让每个集群都能按照同一套标准被创建、交付、观测、升级、恢复和退役。只有把这些生命周期环节真正自动化,舰队规模扩大后才不会依赖少数人的经验维持。

Copyright © yan-jian.com 2023 - 2026 · Powered by GitBook更新时间: 2026-10-22 21:19:02

results matching ""

    No results matching ""