1. GitOps 概述

1.1 什么是 GitOps

GitOps 是一种以 Git 仓库作为单一事实来源(Single Source of Truth)的云原生运维模式。它将声明式基础设施与版本控制相结合,通过自动化流程确保集群的实际状态始终与 Git 中定义的期望状态保持一致。

核心思想: Git 仓库不仅是代码的存储地,更是整个系统状态的权威描述。任何对基础设施或应用配置的变更,都必须先提交到 Git,再由自动化工具同步到目标环境。

1.2 GitOps 三大核心原则

原则 说明 关键实践
声明式(Declarative) 系统期望状态由描述性文件定义,而非指令性脚本 使用 Kubernetes YAML、Helm Chart、Kustomize 等声明式配置
版本控制(Version Controlled) 所有配置变更通过 Git 提交记录,可追溯、可回滚 分支策略、Pull Request 审查、标签与 Release
自动化(Automated) Git 仓库变更自动触发同步,无需手动干预 Argo CD、Flux CD 等 Operator 持续对比与同步
GitOps 核心原则架构 Git 仓库(单一事实来源) 声明式配置 YAML / Helm / Kustomize 版本控制 Git 提交 / PR / 标签 自动化同步 Argo CD / Flux CD 描述“是什么”而非“怎么做” 所有变更必须经过 Git 自动检测偏差并修复 无需 SSH 到集群操作

1.3 GitOps 与传统 CI/CD 的区别

传统 CI/CD 以“推送(Push)”模式驱动,而 GitOps 采用“拉取(Pull)”模式。下表从多个维度对比两种模式的核心差异:

对比维度 传统 CI/CD GitOps
部署模式 CI 流水线推送制品到环境 Operator 从 Git 拉取期望状态并同步
配置存储 分散在 Jenkinsfile、脚本、配置中心 统一存储在 Git 仓库
变更触发 Webhook 或定时触发流水线 Git 提交触发自动同步
回滚方式 重新运行旧版本流水线或手动恢复 git revert 或切换到旧分支
状态一致性 依赖流水线执行结果,可能漂移 持续对比,自动修复漂移
安全模型 CI 工具需要集群凭证 Operator 只读访问 Git,无需暴露集群凭证
关键洞察: GitOps 将“部署”从 CI 流水线中剥离,CI 只负责构建和测试,部署由专门的 GitOps Operator 完成。这种分离显著降低了 CI 系统的权限风险,同时提升了部署的可审计性。

1.4 GitOps 工作流示例

一个典型的 GitOps 工作流包含以下步骤:

  1. 开发人员 修改应用配置或 Kubernetes 清单,提交 Pull Request 到 Git 仓库。
  2. CI 流水线 执行代码检查、单元测试、镜像构建,并将新镜像推送到容器仓库。
  3. 代码审查 通过后,变更合并到主分支(main/release)。
  4. GitOps Operator(如 Argo CD)检测到 Git 仓库状态变化,拉取最新配置。
  5. Operator 对比集群当前状态与 Git 中定义的期望状态,生成差异补丁。
  6. 自动同步 将变更应用到目标集群,完成配置热更新。
GitOps 工作流(Pull 模式) 开发者 Git 仓库 GitOps Operator Kubernetes 集群 持续对比与修复 关键特征:Operator 主动拉取 Git 状态,而非 CI 推送;集群无需对外暴露 API 凭证 所有变更可审计、可回滚、可复现

1.5 为什么 GitOps 适合 Envoy 配置热更新

Envoy 作为数据面代理,其配置变更频繁且对正确性要求极高。GitOps 为 Envoy 配置管理带来以下优势:

  • 配置版本化: 每次 Envoy 配置变更都有 Git 提交记录,方便审计和问题定位。
  • 声明式路由规则: 使用 Istio VirtualService / DestinationRule 等 CRD 声明式定义流量策略。
  • 自动同步与回滚: 当配置错误导致故障时,可通过 git revert 快速恢复。
  • 同步窗口控制: 结合同步窗口策略,在业务低峰期执行配置变更,降低风险。
注意: GitOps 并非银弹。对于需要毫秒级响应的配置变更,或涉及敏感凭证的动态注入场景,需要结合 Secret 管理工具(如 Sealed Secrets、External Secrets)和同步窗口策略来弥补纯 GitOps 的不足。