1. GitOps 核心理念:声明式模型、期望状态与当前状态、Git 作为单一事实来源
GitOps 是一种以 声明式模型 为核心的运维与交付范式。它要求运维人员将整个系统的目标配置以声明式文件的形式存储在 Git 仓库中,并通过自动化机制持续确保集群的实际运行状态与仓库中定义的期望状态保持一致。理解这一理念是掌握 GitOps 回滚设计与准入核验的基础。
1.1 声明式模型(Declarative Model)
声明式模型强调“定义目标状态,而非执行步骤”。运维人员只需描述系统“应该是什么样”,而不需要编写如何达到该状态的指令序列。这与传统的命令式(Imperative)模型形成鲜明对比。
| 对比维度 | 声明式模型 | 命令式模型 |
|---|---|---|
| 核心关注点 | What(目标状态) | How(执行步骤) |
| 操作方式 | 提交 YAML/JSON 清单文件 | 执行 kubectl run / apply 等命令 |
| 幂等性 | 天然幂等,重复应用同一清单结果一致 | 需手动保证幂等,易产生漂移 |
| 回滚能力 | 通过 Git revert 或切换分支即可回滚 | 需手动执行反向操作,易出错 |
| 审计追溯 | Git 历史天然提供完整变更记录 | 依赖操作日志,难以关联 |
关键实践: 在 GitOps 工作流中,所有对 Kubernetes 资源的变更(Deployment、Service、ConfigMap 等)都必须通过修改 Git 仓库中的声明式文件来触发,禁止直接通过 kubectl 命令修改集群状态。
1.2 期望状态(Desired State)与当前状态(Current State)
GitOps 的核心循环围绕两个状态展开:期望状态 定义在 Git 仓库中,当前状态 是集群中实际运行的资源情况。GitOps 控制器(如 Argo CD、Flux)持续执行“差异检测与调和”过程。
- 期望状态(Desired State):存储在 Git 仓库中的完整配置集合,包括应用版本、副本数、网络策略、存储卷等所有声明式定义。
- 当前状态(Current State):Kubernetes API Server 中实时反映的集群资源实际运行情况。
- 调和循环(Reconciliation Loop):控制器定期或通过 Webhook 触发,对比期望状态与当前状态,自动执行创建、更新或删除操作以消除差异。
1.3 Git 作为单一事实来源(Single Source of Truth)
在 GitOps 体系中,Git 仓库被提升为整个系统的 单一事实来源。这意味着所有环境(开发、预发布、生产)的配置、所有基础设施定义、所有应用版本信息都必须且只能从 Git 仓库中获取权威版本。
实践要点: 单一事实来源要求团队建立严格的 Git 分支策略(如 GitFlow 或 Trunk-Based Development),并通过 Pull Request 机制进行变更审核。任何绕过 Git 直接修改集群的行为都视为配置漂移(Configuration Drift),必须被自动化工具检测并纠正。
Git 作为单一事实来源带来的核心优势
- 完整审计轨迹: 每一次配置变更都有对应的 Git Commit,包含作者、时间戳、变更说明,满足合规审计要求。
- 快速回滚能力: 回滚操作等同于将 Git 仓库恢复到历史 Commit,然后由控制器自动将集群同步到该历史状态。
- 环境一致性: 所有环境使用同一套声明式清单,通过参数化(如 Kustomize overlay 或 Helm values)区分环境差异,避免环境间配置漂移。
- 协作与权限控制: 基于 Git 仓库的权限模型(如分支保护、Code Review)天然适用于运维团队协作。
常见误区: 将 Git 仓库仅当作“备份”或“记录”使用,而非“权威来源”。例如,运维人员通过 kubectl scale 手动调整了副本数,但未同步更新 Git 仓库中的清单文件。此时 GitOps 控制器会在下一次调和循环中将副本数强制恢复为 Git 中定义的值,导致“意外回滚”。正确的做法是始终通过修改 Git 仓库来驱动变更。
1.4 核心理念对回滚设计与准入核验的指导意义
理解上述三大核心理念,为后续章节中回滚记录的设计和 Prometheus 准入核验的实现奠定了理论基础:
| 核心理念 | 对回滚设计的指导 | 对准入核验的指导 |
|---|---|---|
| 声明式模型 | 回滚即切换 Git 仓库中的声明式文件到历史版本,无需编写回滚脚本 | 准入核验应校验新提交的声明式文件是否符合集群安全与合规策略 |
| 期望状态 vs 当前状态 | 回滚后需等待调和循环完成,确保当前状态收敛到期望的历史状态 | 核验应包含对期望状态与当前状态差异的预检,防止破坏性变更 |
| Git 单一事实来源 | 回滚记录天然由 Git Commit 历史承载,无需额外设计回滚日志系统 | 准入核验应基于 Git 仓库中的最新配置,而非集群中的运行时状态 |