2. GitOps 基础:核心原则、工作流与常用工具

GitOps 是将 DevOps 最佳实践与基础设施即代码(IaC)相结合的一种运营模型,其核心思想是将 Git 仓库作为整个系统的单一事实来源(Single Source of Truth)。在《Kyverno 策略驱动 GitOps 调度优化实践》课程中,理解 GitOps 的基石是后续利用 Kyverno 策略进行调度干预的前提。

2.1 GitOps 核心原则

GitOps 建立在三大支柱之上:声明式、版本控制和自动化。这三者共同确保了系统的可审计性、可复现性和自愈能力。

原则 核心描述 在 Kubernetes 中的体现
声明式 系统状态由用户期望的配置(Desired State)定义,而非操作步骤。 YAML 清单(Deployment、Service、Namespace)描述集群的最终状态。
版本控制 所有声明式配置都存储在 Git 仓库中,每次变更都产生可追溯的提交记录。 通过 Git 提交历史回滚或审计任何资源变更。
自动化 集群持续与 Git 仓库中的期望状态进行比对,自动纠正漂移。 Operator 或控制器自动应用变更,无需手动 kubectl apply。
实践要点: 声明式配置是 GitOps 的根基。如果集群中有人通过 kubectl edit 手动修改了资源,GitOps 工具会自动将其还原为 Git 仓库中的版本,这就是“自愈”能力。

2.2 GitOps 工作流:Push vs Pull

GitOps 的自动化实现主要分为两种架构模式:Push 模式和Pull 模式。在云原生生态中,Pull 模式已成为主流。

2.2.1 Push 模式

在 Push 模式中,CI/CD 管道(如 Jenkins、GitHub Actions)拥有对集群的访问权限。当代码合并到主分支后,管道直接执行 kubectl apply 或 helm upgrade 将配置推送到集群。

  • 优点: 实现简单,与现有 CI 工具集成度高。
  • 缺点: 需要将集群凭证暴露给 CI 系统,安全风险较高;集群状态与 Git 仓库的绑定较弱。

2.2.2 Pull 模式

在 Pull 模式中,集群内部运行一个 Operator(如 Argo CD、Flux),该 Operator 主动监听 Git 仓库的变化,并将期望状态拉取到集群中。CI 管道仅负责将代码构建为镜像并更新 Git 仓库中的清单。

  • 优点: 安全性高(集群无需对外暴露 API)、状态强一致、天然支持多集群管理。
  • 缺点: 需要额外部署 Operator,架构相对复杂。
架构对比: 下图展示了 Push 与 Pull 模式的核心差异。Pull 模式通过集群内的 Agent 消除了 CI 系统对集群的直接访问。
GitOps 工作流对比:Push 模式 vs Pull 模式 Push 模式 Git 仓库 CI 管道 K8s 集群 触发 kubectl apply Pull 模式 Git 仓库 CI 管道 GitOps Operator K8s 集群 更新清单 监听/拉取 调和 ✅ 推荐模式:安全、可审计、多集群友好

2.3 常用 GitOps 工具:Argo CD 与 Flux

目前社区最流行的两款 GitOps 工具是 Argo CD 和 Flux。它们都采用 Pull 模式,但在设计哲学和功能侧重点上有所不同。

2.3.1 Argo CD

Argo CD 是 CNCF 毕业项目,以其强大的 Web UI 和 Application 抽象著称。它允许用户通过 Application CRD 定义应用来源与目标集群。

  • 核心特性: 可视化 Dashboard、SSO 集成、多集群管理、Sync 策略(手动/自动)、Prune 资源。
  • 适用场景: 需要频繁进行人工审核和手动同步的团队,或需要直观查看应用状态的环境。

2.3.2 Flux

Flux 是 CNCF 孵化项目,强调“Kubernetes 原生”和“无需外部数据库”。它基于 source.toolkit.fluxcd.io 和 kustomize.toolkit.fluxcd.io 等 API 构建。

  • 核心特性: 完全基于 CRD 驱动、支持多租户(Tenancy)、依赖管理(DependsOn)、Webhook 接收器(Notification Controller)。
  • 适用场景: 追求极简架构、希望完全通过 Git 和 CRD 管理一切、对多租户隔离有严格要求的平台团队。
选型建议: 如果你的团队更看重 UI 交互和手动控制,Argo CD 是更好的选择;如果你希望将 GitOps 深度嵌入 Kubernetes 控制平面,且需要强大的多租户能力,Flux 更合适。本课程后续的 Kyverno 策略集成对两者均适用。

2.3.3 工具对比一览

维度 Argo CD Flux
架构 Application CRD + API Server + Repo Server Source Controller + Kustomize Controller + Helm Controller
UI 界面 功能丰富,支持拓扑图 无内置 UI,依赖 CLI 或第三方
多租户 通过 Project 实现 原生支持,基于 Kustomize 和 RBAC
同步策略 支持自动同步、手动同步、Prune 自动同步为主,支持手动干预
Helm 支持 支持 Helm Chart 和 OCI 仓库 支持 HelmRelease CRD,功能更深入

2.4 GitOps 工作流全景图

下图展示了一个基于 Pull 模式的完整 GitOps 工作流,涵盖了从代码提交到集群状态调和的完整链路。这也是本课程后续章节中 Kyverno 策略介入的上下文环境。

GitOps 工作流全景图(Pull 模式) 开发者 Git 仓库 CI 管道 镜像仓库 git push 触发 推送镜像 GitOps Operator(Argo CD / Flux) 监听/拉取 Kubernetes 集群 调和(Reconcile) Kyverno 策略引擎(准入控制) 资源创建/更新 Kyverno 在此处 拦截并验证资源
工作流总结:
  1. 开发者将代码和 Kubernetes 清单推送到 Git 仓库。
  2. CI 管道构建镜像并推送到镜像仓库,同时更新 Git 仓库中的清单(如 Deployment 的镜像 Tag)。
  3. GitOps Operator 检测到 Git 仓库变更,拉取最新清单。
  4. Operator 将清单与集群当前状态进行比对,并执行调和操作(创建/更新/删除资源)。
  5. 在资源应用到集群前,Kyverno 策略引擎作为准入控制器进行校验和变异,确保资源符合调度策略。