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 流水线的三个核心集成点:
- Git Webhook 集成(集成点 1):当开发者向 Federation 配置仓库提交 PR 时,Git Webhook 自动触发门禁的“预检”模式,在合并前给出校验报告。此阶段不阻塞流水线,仅提供预警。
- CI 回调集成(集成点 2):构建与单元测试完成后,CI 工具(如 Jenkins、GitLab CI)通过 REST API 回调门禁服务,传入变更清单与目标集群列表。门禁执行完整校验并返回通过/拒绝状态码。
- 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 验证流程,确保策略本身不会成为新的故障源。