1. GitOps 核心理念:声明式配置、不可变基础设施、Git 作为单一事实来源

GitOps 是一种以 Git 仓库为运维与交付中心的现代化运维模式。其核心在于将运维与部署的“期望状态”全部声明在 Git 中,并通过自动化机制持续将实际环境向该期望状态收敛。理解 GitOps 的三个核心理念,是掌握后续发布窗口与分支晋级机制的基础。

1.1 三大核心理念概览

理念 核心含义 对发布流水线的价值
声明式配置 描述系统“应该是什么状态”,而非“如何达到该状态”。 发布内容即代码,可审计、可回滚、可复现。
不可变基础设施 部署单元(容器、虚拟机)一旦创建,不再原地修改;更新时直接替换。 消除配置漂移,确保发布窗口内环境一致性。
Git 作为单一事实来源 所有环境(开发、预发、生产)的期望状态均以 Git 仓库中的声明为准。 分支晋级、回滚、审批均基于 Git 提交历史,形成完整审计链。
实践要点: 在 GitOps 模式下,任何手动修改线上环境的行为都应被视为“事故”。所有变更必须通过 Git 提交触发,再由 Operator 或 CI/CD 系统自动同步。

1.2 声明式配置 vs. 指令式配置

声明式配置是 GitOps 的基石。以下对比可帮助理解其差异:

维度 指令式配置 声明式配置
操作方式 执行一系列命令(如 kubectl run、kubectl scale) 提交一份 YAML 描述文件(如 Deployment、Service)
状态管理 系统状态由命令执行顺序决定,易产生漂移 系统持续向 Git 中的期望状态收敛,自动修复漂移
回滚方式 需逆向执行命令或手动恢复 直接 revert Git 提交,Operator 自动同步旧状态
审计能力 依赖操作日志,难以追溯完整变更链 每次变更对应一次 Git commit,天然具备完整审计链
# 指令式示例:手动创建并暴露应用
kubectl create deployment my-app --image=my-app:v1
kubectl expose deployment my-app --port=80 --type=LoadBalancer

# 声明式示例:提交 YAML 到 Git,Operator 自动同步
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:v1
        ports:
        - containerPort: 80

1.3 不可变基础设施:消除“配置漂移”

在传统运维中,服务器运行时间越长,手动补丁、临时修改、依赖升级导致的“配置漂移”越严重。不可变基础设施要求:

  • 每次部署创建全新实例:发布新版本时,直接基于新镜像启动新 Pod/VM,旧实例被销毁。
  • 禁止运行时修改:不允许 SSH 进入容器修改配置、安装包或打补丁。
  • 版本与镜像强绑定:每个部署版本对应一个不可变的容器镜像或虚拟机镜像。
发布窗口中的意义: 在分支晋级回归检查阶段,不可变基础设施确保“测试环境验证通过的镜像”与“生产环境即将运行的镜像”完全一致,杜绝“在我机器上是好的”这类问题。

1.4 Git 作为单一事实来源:分支晋级的基础

Git 仓库中存储了所有环境的期望状态声明文件。发布流水线中的“分支晋级”本质上是将某个 Git 分支(如 release/v1.2)的声明合并到代表更高环境的分支(如 production)。

GitOps 单一事实来源与分支晋级模型 Git 仓库(单一事实来源) feature/xxx release/v1.2 production 开发环境 预发环境 生产环境 回归检查(发布窗口内) 验证 release/v1.2 分支声明 → 预发环境测试通过 → 合并到 production 分支 Git 提交即变更记录 每次分支合并 = 一次 Git commit = 可审计、可回滚的发布单元

1.5 三者协同:发布流水线的信任链

在 GitOps 发布流水线中,三个理念形成闭环:

  1. 声明式配置 将发布内容标准化为 YAML/JSON 文件,存储在 Git 中。
  2. 不可变基础设施 确保每次发布使用全新的、与声明完全一致的运行环境。
  3. Git 作为单一事实来源 提供分支晋级、审批、回滚的完整审计轨迹。
常见误区: 有些团队虽然使用了 Git 仓库,但仍然允许运维人员通过 kubectl edit 或控制台直接修改线上资源。这种做法破坏了“Git 作为单一事实来源”的原则,导致 Git 中的声明与实际环境不一致,回归检查失去意义。