1. GitOps 核心概念:声明式配置、状态同步、不可变基础设施、Git 作为单一事实来源
GitOps 是一种以 Git 仓库为单一事实来源(Single Source of Truth)的运维模式,它将声明式配置与自动化状态同步相结合,实现基础设施与应用的持续交付。理解以下四个核心概念,是掌握 Flux 与 Argo CD 选型对比的基础。
1.1 声明式配置(Declarative Configuration)
声明式配置描述系统“应该是什么状态”,而非“如何达到该状态”。运维人员只需在 Git 仓库中定义期望的最终状态(如 Deployment 副本数、Service 端口、ConfigMap 内容),GitOps 工具会自动将实际集群状态收敛至该期望状态。
| 对比维度 | 声明式配置 | 命令式配置 |
|---|---|---|
| 定义方式 | YAML/JSON 描述期望状态 | CLI 命令逐步操作 |
| 可审计性 | Git 历史完整记录变更 | 依赖操作日志,易丢失 |
| 回滚方式 | Git revert 即可恢复 | 需手动逆向操作 |
| 典型工具 | Flux、Argo CD、Kustomize | kubectl run、helm install --set |
实践要点:声明式配置要求所有资源清单(Deployment、Service、Ingress 等)都存储在 Git 仓库中,避免使用 kubectl run 或 helm install --set 等命令式操作破坏单一事实来源。
1.2 状态同步(State Synchronization)
状态同步是 GitOps 的核心循环机制:GitOps Operator 持续比较 Git 仓库中的期望状态与 Kubernetes 集群的实际状态,当两者不一致时自动执行协调(Reconciliation)操作,将集群状态拉回期望状态。
关键指标:Flux 默认同步间隔为 1 分钟(可配置),Argo CD 默认同步间隔为 3 分钟。在资源配额校准场景中,较短的同步间隔能更快发现配额超限并触发告警。
1.3 不可变基础设施(Immutable Infrastructure)
不可变基础设施强调:一旦部署,运行中的组件不应被修改。任何变更都应通过替换整个组件(如重建 Pod、升级镜像版本)来实现,而非对运行中的容器执行 exec 或 patch 操作。
- 优势:消除配置漂移(Configuration Drift),环境一致性高,回滚简单(直接切换至旧版本镜像)。
- 与 GitOps 的关系:Git 仓库中的每次提交都对应一个不可变的基础设施版本,Operator 通过更新镜像 Tag 或 Helm Chart 版本来触发滚动更新。
- 资源配额校准场景:当 Namespace 资源配额(ResourceQuota)需要调整时,应修改 Git 仓库中的配额 YAML 文件,而非直接 kubectl edit resourcequota。
1.4 Git 作为单一事实来源(Single Source of Truth)
在 GitOps 模型中,Git 仓库是唯一被信任的权威数据源。所有环境(开发、预发、生产)的期望状态都必须在 Git 仓库中定义,任何手动修改集群的行为都会在下一次同步时被覆盖。
| 原则 | 说明 | 违规后果 |
|---|---|---|
| 唯一性 | 所有资源定义只存在于 Git 仓库 | 集群状态与 Git 不一致,同步失败 |
| 可追溯 | 每次变更都有 Git Commit 记录 | 无法定位谁在何时修改了配额 |
| 自动化 | Operator 自动将集群同步至 Git 状态 | 手动修改被覆盖,运维混乱 |
| 权限控制 | 通过 Git 仓库的 PR/Merge 流程管控变更 | 未经审核的变更直接生效 |
常见误区:部分团队将 Git 仓库仅作为“备份”使用,仍通过 kubectl 直接修改集群。这破坏了单一事实来源原则,导致 Git 状态与集群状态永久偏离,GitOps 工具将无法正常工作。在资源配额校准场景中,务必坚持“先改 Git,再同步集群”的工作流。
1.5 四个核心概念的关系总结
声明式配置是 GitOps 的“语言”,Git 仓库是“存储介质”,状态同步是“执行引擎”,不可变基础设施是“安全约束”。四者共同构成 GitOps 的闭环体系,为 Flux 与 Argo CD 的资源配额校准能力提供了理论基础。
- 声明式配置 → Git 仓库:将期望状态以 YAML 形式提交至 Git。
- Git 仓库 → 状态同步:Operator 从 Git 拉取配置并对比集群状态。
- 状态同步 → 不可变基础设施:通过替换而非修改的方式实现变更。
- 不可变基础设施 → 声明式配置:每次变更都生成新的不可变版本,更新 Git 仓库中的声明式配置。