2. GitOps 基础:声明式配置、Git 作为单一事实源、自动化同步与自愈

GitOps 是一种以 Git 仓库为唯一可信源(Single Source of Truth)的运维模式,它将声明式配置、版本控制与自动化交付流水线深度结合,为多集群环境下的配置一致性提供了可审计、可回滚、可复现的工程基础。本章聚焦 GitOps 的三个核心支柱:声明式配置、Git 作为单一事实源、自动化同步与自愈。

2.1 声明式配置:描述目标状态,而非操作步骤

声明式配置的核心思想是“告诉系统你想要什么,而不是告诉它怎么做”。在 Kubernetes 生态中,声明式配置表现为 YAML 或 JSON 格式的资源清单(Manifest),例如 Deployment、Service、ConfigMap 等。

关键区别: 命令式(Imperative)配置关注“如何做”,例如 kubectl run、kubectl scale;声明式(Declarative)配置关注“最终状态”,例如 kubectl apply -f deployment.yaml。

声明式配置的优势在于:

  • 可复现性:同一份配置在任何集群、任何时间应用,结果一致。
  • 可审计性:配置变更通过 Git 提交记录完整追溯。
  • 幂等性:多次应用同一配置不会产生副作用。
  • 自愈基础:控制器持续对比实际状态与声明状态,自动修复偏差。
维度 命令式配置 声明式配置
操作方式 kubectl create / kubectl delete kubectl apply -f
状态管理 依赖操作顺序和当前状态 由控制器自动调和
回滚能力 需手动执行反向操作 通过 Git revert 自动回滚
多集群一致性 难以保证 天然一致
# 声明式配置示例:nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80

2.2 Git 作为单一事实源

在 GitOps 模型中,Git 仓库不仅是代码仓库,更是整个集群配置的权威来源。所有环境(开发、测试、预发、生产)的期望状态都存储在 Git 中,任何对集群的变更都必须通过 Git 提交来发起。

实践要点: 建议为每个环境(如 dev、staging、prod)建立独立的目录或分支,并采用“环境即目录”或“环境即分支”策略。推荐使用目录隔离,避免分支合并带来的冲突风险。

Git 作为单一事实源带来的核心收益:

  • 版本控制:每一次配置变更都有完整的提交历史、作者、时间戳和变更说明。
  • 变更审批:通过 Pull Request / Merge Request 机制实现代码审查和合规审批。
  • 可回滚:一旦集群状态异常,只需 revert 对应的 Git 提交,自动化同步即可恢复。
  • 灾难恢复:集群完全损毁时,可从 Git 仓库重建所有资源。
Git 作为单一事实源:配置流向与同步模型 Git 仓库 单一事实源 开发人员 CI/CD 流水线 GitOps 控制器 Kubernetes 集群 实际状态 git push 触发 更新清单 拉取期望状态 同步/调和 所有变更必须经过 Git 禁止直接操作集群

2.3 自动化同步与自愈

自动化同步是 GitOps 的“执行引擎”。GitOps 控制器(如 Argo CD、Flux)持续监控 Git 仓库中的期望状态与集群中的实际状态,一旦发现偏差,自动执行同步操作,将集群状态拉回期望状态。

2.3.1 同步机制

同步分为两种模式:

  • 自动同步(Auto Sync):控制器检测到 Git 仓库有新的提交时,自动将变更应用到集群。
  • 手动同步(Manual Sync):变更提交到 Git 后,需要人工确认或通过 CI/CD 触发同步。
生产环境建议: 生产集群推荐使用手动同步 + 自动自愈的组合模式。手动同步确保变更经过审批,自动自愈确保集群不会因意外操作偏离期望状态。

2.3.2 自愈机制

自愈(Self-Healing)是 GitOps 区别于传统 CI/CD 的关键能力。当集群状态因以下原因偏离 Git 中的期望状态时,控制器会自动纠正:

  • 运维人员直接使用 kubectl edit 或 kubectl delete 修改资源。
  • 集群节点故障导致 Pod 被重新调度到不同节点。
  • HPA(水平自动扩缩)或 Cluster Autoscaler 调整副本数。
  • 第三方工具或脚本意外修改资源。
自动化同步与自愈流程 期望状态 Git 仓库中的配置 实际状态 集群中的资源 GitOps 控制器 持续对比与调和 读取 监控 检测到偏差 自动修复(同步) 应用修正

2.3.3 同步策略对比

策略 触发方式 适用场景 风险等级
自动同步 + 自动自愈 Git 提交即触发 开发/测试环境 低(需配合 PR 审查)
手动同步 + 自动自愈 人工确认后触发 预发/生产环境 中(防止意外同步)
手动同步 + 手动自愈 完全人工控制 合规要求严格的场景 高(运维负担大)
最佳实践: 推荐采用“自动同步 + 自动自愈”用于非生产环境,“手动同步 + 自动自愈”用于生产环境。自动自愈应始终开启,以抵御集群漂移(Drift)。

2.4 本章小结