3. GitOps 基础概念:声明式配置、状态同步、Pull vs Push 模式

GitOps 是一种以 Git 仓库作为单一事实来源(Single Source of Truth)的持续交付模式。其核心思想是将运维和部署逻辑从“手动执行命令”转变为“声明期望状态,由系统自动调和”。理解 GitOps 的三个基础概念——声明式配置、状态同步和Pull vs Push 模式——是掌握后续课程中“标准模板与 GitOps 结合”的关键前提。

3.1 声明式配置(Declarative Configuration)

声明式配置是指:你只需要描述系统“应该是什么样子”,而不需要编写“如何达到这个状态”的步骤。在 GitOps 实践中,整个采集作业平台的基础设施、应用配置、作业参数都以 YAML 或 JSON 文件的形式存储在 Git 仓库中。

关键对比: 命令式(Imperative) vs 声明式(Declarative)
维度 命令式(Imperative) 声明式(Declarative)
操作方式 执行具体命令:kubectl create deployment、kubectl scale 提交配置文件:deployment.yaml、configmap.yaml
状态管理 依赖操作者记忆或脚本顺序 Git 仓库中始终保存完整期望状态
可审计性 低,操作记录分散在终端日志中 高,每次变更对应一次 Git Commit
回滚能力 需要手动逆向操作 直接 git revert 或切换分支
适用场景 临时调试、一次性任务 生产环境持续部署、合规管控

在采集作业平台中,声明式配置表现为:

  • 作业模板:定义采集任务的参数、调度规则、输出目标。
  • 平台配置:定义服务副本数、资源限制、环境变量。
  • 网络策略:定义采集器与存储后端之间的访问规则。
# 声明式作业模板示例(采集作业平台)
apiVersion: collector.ops/v1
kind: JobTemplate
metadata:
  name: nginx-log-collector
spec:
  schedule: "*/5 * * * *"
  image: collector-agent:3.2.1
  output:
    type: kafka
    topic: raw-logs
  resources:
    requests:
      cpu: "500m"
      memory: "512Mi"
    limits:
      cpu: "1"
      memory: "1Gi"

3.2 状态同步(State Synchronization)

状态同步是 GitOps 的核心执行机制。系统持续比较 Git 仓库中的“期望状态”与运行环境中的“实际状态”,当两者不一致时,自动执行调和(Reconciliation)操作,使实际状态向期望状态收敛。

核心原则: 状态同步不是“一次性部署”,而是“持续调和”。即使有人手动修改了集群中的资源,GitOps 控制器也会在下一个同步周期将其恢复为 Git 中定义的版本。

状态同步的典型工作流程包含以下步骤:

  1. 检测差异:GitOps 控制器(如 ArgoCD、Flux)定期轮询 Git 仓库或监听 Webhook 事件。
  2. 比对状态:将 Git 中的期望配置与 Kubernetes 集群中的实时资源进行 Diff。
  3. 执行调和:如果存在偏差,控制器自动应用变更(创建、更新或删除资源)。
  4. 反馈状态:将同步结果写回 Git 仓库或通知监控系统。
GitOps 状态同步流程 GitOps 状态同步流程 Git 仓库 期望状态(YAML) GitOps 控制器 Diff + 调和 Kubernetes 集群 实际状态 读取期望状态 应用变更 反馈实际状态 状态回写 / 审计日志 持续调和循环 控制器每隔 N 秒(默认 180s)自动执行一次 Diff → 调和 → 反馈

3.3 Pull vs Push 模式

GitOps 的部署模式分为 Pull 模式和 Push 模式,两者在安全模型、网络拓扑和自动化程度上存在显著差异。在采集作业平台场景中,选择哪种模式直接影响边缘采集器的管理方式。

对比维度 Pull 模式(推荐) Push 模式
执行主体 集群内部的 Operator / Agent CI/CD 管道(如 Jenkins、GitLab CI)
网络方向 集群主动拉取 Git 仓库 CI 系统主动推送至集群 API
安全优势 集群无需暴露 API Server 给外部 需要管理 CI 系统的集群凭据
离线容忍 支持离线缓存,断网时保持最后状态 依赖 CI 系统持续可达
典型工具 ArgoCD、Flux、Jenkins X 传统 CI/CD + kubectl apply
采集平台适用性 适合边缘采集器、防火墙后部署 适合中心化管控、内网开发环境
实践建议: 对于采集作业平台,如果采集器部署在客户内网或跨网络区域,强烈推荐使用 Pull 模式。这样你只需要让采集器集群能够访问 Git 仓库(通常是只读权限),而无需开放 Kubernetes API 端口到公网。
Pull vs Push 模式架构对比 Pull vs Push 模式架构对比 Pull 模式 Git 仓库 Pull(只读) 采集器集群 Operator 定期拉取 本地缓存期望状态 自动调和 优势 无需暴露 API 离线可运行 Push 模式 CI/CD 系统 Push(kubectl apply) 采集器集群 被动接收变更 依赖 CI 触发 需暴露 API Server 劣势 凭据泄露风险 断网无法部署

3.4 三者关系总结

声明式配置、状态同步和 Pull/Push 模式共同构成了 GitOps 的三角支柱:

  • 声明式配置是基础,确保所有变更可追溯、可复现。
  • 状态同步是引擎,驱动系统持续向期望状态收敛。
  • Pull 模式是推荐部署方式,尤其适合采集作业平台这种需要跨网络、高安全要求的场景。