1. GitOps 概述:核心原则、声明式配置、与 CI/CD 的区别、同步窗口的价值

1.1 GitOps 核心原则

GitOps 是一种以 Git 仓库作为单一事实来源(Single Source of Truth)的运维与交付模式。其核心原则可归纳为以下四点:

原则 说明 关键要求
声明式配置 系统期望状态以声明式描述文件(YAML/JSON)定义,而非命令式脚本 幂等性、可版本化、可审计
单一事实来源 Git 仓库保存所有环境配置,集群状态必须与仓库一致 禁止手动修改集群,所有变更通过 PR 驱动
自动同步 Operator 或 Agent 持续对比 Git 仓库与集群状态,自动修复偏差 双向差异检测、自动回滚、手动干预兜底
可观测与可审计 每次变更都有 Git 提交记录,同步结果可追踪 提交签名、变更历史、同步日志
实践要点: GitOps 并非简单的“用 Git 存配置”,而是要求整个交付流程以 Git 仓库为驱动核心,任何手动 kubectl apply 或 UI 点击都应视为违规操作。

1.2 声明式配置 vs 命令式配置

声明式配置是 GitOps 的基石。以下对比帮助理解两种模式的本质差异:

维度 声明式配置 命令式配置
描述方式 “系统应该是什么状态” “系统应该执行什么操作”
示例 replicas: 3 kubectl scale --replicas=3
幂等性 天然幂等,重复执行结果一致 非幂等,重复执行可能产生副作用
版本管理 配置文件可直接纳入 Git 管理 操作日志难以结构化存储
偏差修复 自动检测并回滚至期望状态 需人工介入排查
# 声明式示例:Deployment 期望状态
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80

1.3 GitOps 与 CI/CD 的区别

传统 CI/CD 与 GitOps 在交付流程中的职责不同,二者是互补关系而非替代关系。

核心区别: CI/CD 负责“构建与验证”,GitOps 负责“部署与同步”。CI 产出制品(镜像、包),GitOps 消费制品并驱动环境状态变更。
对比维度 传统 CI/CD GitOps
触发方式 代码提交 → 自动构建 → 自动部署 Git 仓库配置变更 → 自动同步
部署驱动 Pipeline 脚本直接调用 API Operator 持续对比并调和
状态管理 Pipeline 执行结果即状态 Git 仓库定义期望状态
回滚方式 重新执行 Pipeline 或手动回滚 Git revert 提交,自动同步
安全模型 CI/CD 系统需持有集群凭证 Operator 持有凭证,开发者仅需 Git 权限
GitOps 与 CI/CD 协作流程 CI:构建 & 测试 代码提交 → 镜像构建 → 单元测试 制品仓库 镜像 / Helm Chart / Kustomize GitOps:同步 & 部署 PR 合并 → 自动同步 → 状态调和 Git 配置仓库 声明式配置(YAML / JSON) Kubernetes 集群 实际运行状态 持续调和(Reconcile Loop) 说明: CI 阶段产出制品并更新 Git 仓库中的配置(镜像 Tag),GitOps Operator 检测到仓库变更后自动同步至集群。

1.4 同步窗口的价值

同步窗口(Sync Window)是 GitOps 中用于控制自动同步行为的时间策略机制。其核心价值体现在以下方面:

  • 变更管控: 限制自动同步仅在特定时间窗口内执行,避免非工作时段意外变更影响业务。
  • 合规与审计: 满足金融、医疗等行业的变更窗口要求,所有部署操作集中在可追溯的时间段。
  • 资源保护: 在业务高峰期(如大促、秒杀)禁止自动同步,防止配置变更引发性能抖动。
  • 多环境协调: 开发、测试、生产环境可配置不同的同步窗口,实现分阶段灰度发布。
场景 同步窗口配置 预期效果
生产环境 周一至周五 09:00-18:00 仅在工作时间执行自动同步,避免夜间变更
大促期间 禁止同步(窗口关闭) 锁定环境配置,防止意外变更影响稳定性
开发环境 全天候(24×7) 快速迭代,随时同步最新配置
合规审计 仅允许审批后的 PR 触发同步 所有变更可追溯至具体审批记录
常见误区: 同步窗口不是“暂停 GitOps”,而是“暂停自动同步”。手动触发同步(如通过 CLI 或 UI)通常不受窗口限制,用于紧急修复场景。
同步窗口工作流程 Git 仓库 配置变更提交 同步窗口判断 当前时间是否在窗口内? 执行同步 等待下一窗口 是 否 Kubernetes 集群 状态更新 关键行为: 不在窗口内的变更不会丢失,GitOps Operator 会持续检测,一旦进入窗口立即触发同步。

1.5 本章小结