3. 多集群变更门禁定义

多集群变更门禁是 Federation 架构下保障多集群一致性与安全性的第一道防线。它并非简单的“通过/拒绝”二元开关,而是一套可编程、可观测、可回滚的策略执行引擎,在变更从 CI/CD 流水线流向目标集群之前完成校验与裁决。

3.1 门禁的作用

门禁在 Federation 多集群场景中承担三个核心职责:

职责 说明 典型场景
一致性校验 确保同一 Federation 成员集群上的资源定义、版本、配置差异在可控范围内 跨集群 Deployment 的 replicas 差异不超过 ±20%
安全准入 阻止不符合安全基线(PSP、NetworkPolicy、RBAC)的变更进入生产集群 禁止 privileged container 部署到 prod-* 集群
依赖与拓扑验证 验证变更是否破坏集群间服务依赖、DNS 路由或存储拓扑 ServiceExport 变更前检查对端集群是否已导入同名 Service
设计原则:门禁应保持“fail-closed”特性——当门禁组件自身不可用时,默认拒绝变更,而非放行。这避免了因门禁故障导致未校验的变更扩散到所有集群。

3.2 门禁的触发条件

门禁并非每次代码提交都全量触发,而是根据变更类型、影响范围和集群角色分级触发。以下为推荐的触发条件矩阵:

触发条件 变更类型 校验范围 示例
Federation 资源变更 FederatedDeployment / FederatedService 等 CRD 的创建、更新、删除 所有关联成员集群 修改 FederatedDeployment 的 template.spec.containers.image
集群标签变更 成员集群的 label / annotation 修改 该集群上所有受 Federation 管理的资源 将 prod-east 集群的 environment 标签从 staging 改为 production
调度策略变更 ReplicaSchedulingPreference / Placement 策略的更新 受该策略影响的全部集群 将 weight 从 1:1 调整为 2:1
全局配置变更 Federation API Server 配置、Webhook 证书、OIDC 提供方变更 Federation 控制面全局 更新 Federation API Server 的 --max-requests-inflight

此外,门禁支持手动触发与定时触发两种辅助模式:

  • 手动触发:SRE 在紧急回滚或合规审计时主动调用门禁 API 执行全量校验。
  • 定时触发:每 30 分钟对关键集群执行一次“门禁健康检查”,确保门禁规则本身未被绕过。
避坑提示:避免将“集群节点扩缩容”或“底层 CNI 升级”等基础设施变更直接纳入门禁触发条件。这类变更应由集群生命周期管理组件处理,门禁只关注 Federation 控制面与资源调度层。

3.3 门禁与 CI/CD 流水线的集成点

门禁不是独立运行的孤岛,它必须嵌入 CI/CD 流水线的关键节点才能发挥实效。以下为推荐的集成架构:

门禁与 CI/CD 流水线集成架构 门禁与 CI/CD 流水线集成架构 代码提交 构建 & 单元测试 门禁校验 多集群部署 准入 Webhook 策略引擎 (OPA/Gatekeeper) 集群差异计算器 回滚决策模块 通过 拒绝 触发回滚 集成点 1: Git Webhook 集成点 2: CI 回调 集成点 3: CD 前置钩子

门禁与 CI/CD 流水线的三个核心集成点:

  1. Git Webhook 集成(集成点 1):当开发者向 Federation 配置仓库提交 PR 时,Git Webhook 自动触发门禁的“预检”模式,在合并前给出校验报告。此阶段不阻塞流水线,仅提供预警。
  2. CI 回调集成(集成点 2):构建与单元测试完成后,CI 工具(如 Jenkins、GitLab CI)通过 REST API 回调门禁服务,传入变更清单与目标集群列表。门禁执行完整校验并返回通过/拒绝状态码。
  3. CD 前置钩子集成(集成点 3):在 ArgoCD / Flux 执行多集群部署前,通过 PreSync hook 调用门禁的“最终确认”接口。此接口会结合实时集群状态(如 etcd 快照、资源配额)做最终裁决。
最佳实践:门禁的校验结果应作为 CI/CD 流水线的“门控 artifact”持久化存储(例如存入 S3 或 etcd),供后续审计与回滚决策使用。建议使用 FederationGateResult CRD 记录每次校验的输入、输出、时间戳与决策者。

3.4 门禁策略的版本化管理

门禁策略本身也需要纳入版本管理,避免“策略漂移”导致不同集群执行不同规则。推荐使用 GitOps 方式管理门禁策略:

# 门禁策略仓库结构示例
federation-gate-policies/
├── policies/
│   ├── global/                    # 全局策略,适用于所有集群
│   │   ├── disallow-privileged.yaml
│   │   └── require-resource-limits.yaml
│   ├── environment/               # 按环境分组的策略
│   │   ├── production/
│   │   │   ├── require-hpa.yaml
│   │   │   └── enforce-pdb.yaml
│   │   └── staging/
│   │       └── allow-debug-containers.yaml
│   └── cluster-specific/          # 集群级例外策略
│       ├── prod-east-override.yaml
│       └── dr-site-exception.yaml
├── gate-config.yaml               # 门禁全局配置(超时、重试、日志级别)
└── .github/workflows/
    └── gate-policy-sync.yaml      # 自动同步策略到所有 Federation 成员集群

每次门禁策略变更都必须经过与业务代码相同的 PR 审查与 CI 验证流程,确保策略本身不会成为新的故障源。