GitOps 基础回顾:声明式配置、Git 作为单一事实来源、Pull vs Push 模式、Operator 模式

在深入平台门户集成与 Scheduler 参数优化之前,必须重新夯实 GitOps 的核心基础。GitOps 并非简单的“用 Git 存 YAML”,而是一套以声明式配置为输入、以 Git 仓库为权威源、以自动化同步为引擎的交付范式。本节从四个维度拆解其底层逻辑。

2.1 声明式配置:期望状态驱动

声明式配置是 GitOps 的“语言”。运维人员只需描述系统“应该是什么样”,而不必编写“如何变成这样”的步骤。Kubernetes 原生资源(Deployment、Service、ConfigMap)本身就是声明式的典范。

声明式 vs 命令式对比
维度 命令式(Imperative) 声明式(Declarative)
操作方式 kubectl run、kubectl scale kubectl apply -f deployment.yaml
状态管理 手动跟踪变更历史 Git 自动记录每次期望状态
可复现性 依赖操作顺序和环境 任意时刻从 Git 重建完全一致
回滚能力 需手动逆向操作 Git revert + 自动同步
适用场景 调试、临时修复 生产环境、合规审计

声明式配置的核心价值在于:系统持续向 Git 中定义的期望状态收敛。任何手动修改(如 kubectl edit)都会被下一次同步覆盖,从而杜绝配置漂移。

# 声明式 Deployment 示例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: scheduler-worker
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: worker
        image: myregistry/scheduler:1.2.0
        resources:
          requests:
            cpu: "500m"
            memory: "512Mi"

2.2 Git 作为单一事实来源

Git 仓库不再只是代码托管工具,而是整个平台环境的权威状态存储库。所有环境配置、应用版本、基础设施定义都必须通过 Pull Request 合并到 Git 主分支,才能被同步到目标集群。

关键原则: 如果它不在 Git 里,它就不存在。任何通过 kubectl 直接修改集群的行为都应被视为“事故”,并触发告警。

Git 作为单一事实来源带来的收益:

  • 审计轨迹:每一次变更都有作者、时间戳、Commit SHA,满足 SOC2/PCI 合规要求。
  • 协作基础:团队成员通过 Code Review 控制配置质量,避免“一人一台笔记本”的混乱。
  • 灾难恢复:集群完全损坏时,只需从 Git 重新 Apply 所有资源即可重建。
Git 作为单一事实来源:配置流向 Git 仓库 单一事实来源 生产集群 期望状态:v1.2.0 预发集群 期望状态:v1.3.0-rc 开发集群 期望状态:v1.4.0-dev 每个集群从 Git 仓库拉取对应分支/目录的配置,确保环境间差异受控 任何手动修改都会被下一次同步覆盖

2.3 Pull vs Push 模式

GitOps 同步机制分为两种主流模式,理解其差异对设计 Scheduler 参数优化窗口至关重要。

Push 模式(传统 CI/CD)

CI 流水线在构建完成后,主动将配置“推送”到目标集群。典型工具:Jenkins、GitLab CI 直接执行 kubectl apply。

  • 优点:实时性高,适合开发环境快速迭代。
  • 缺点:CI 需要集群凭证,安全风险高;集群网络必须对 CI 开放;难以处理大规模集群的并发同步。

Pull 模式(GitOps 原生)

集群内部运行一个 Agent(如 Argo CD、Flux),由 Agent 定期从 Git 仓库拉取配置并与当前集群状态做差异对比,自动修正漂移。

  • 优点:集群无需对外暴露 API;Agent 可离线运行;天然支持多集群。
  • 缺点:同步存在延迟(默认 3-5 分钟),需要配合 Webhook 或 Scheduler 优化。
对比维度 Push 模式 Pull 模式
安全模型 CI 持有集群凭证 集群主动拉取,无需暴露
同步触发 CI 事件驱动 定时轮询 + Webhook
配置漂移修复 不自动修复 自动回滚到 Git 状态
网络要求 集群 API 可达 Git 仓库可达
典型工具 Jenkins、Spinnaker Argo CD、Flux
平台工程注意: 在集成 Scheduler 参数优化时,Pull 模式是首选。因为 Agent 可以在同步窗口内批量处理多个应用的期望状态,避免 Push 模式下 CI 并发风暴导致 API Server 过载。

2.4 Operator 模式

Operator 是 Kubernetes 上扩展控制器逻辑的标准模式。它将领域知识(如数据库备份、消息队列扩缩容)编码为自定义控制器,持续监控并调整集群状态。

Operator 与 GitOps 的关系:

  • 互补而非替代:GitOps 负责“配置的同步”,Operator 负责“运行时的自治”。
  • 典型协作:GitOps 将 Custom Resource(CR)同步到集群,Operator 监听 CR 变化并执行复杂操作(如创建 PVC、调整集群节点)。
GitOps + Operator 协作架构 Git 仓库 Argo CD / Flux Custom Resource Operator StatefulSet / PVC 存储期望状态 (CR YAML)

Operator 模式在平台门户集成中的典型场景:

  • Scheduler 参数调优:编写一个 SchedulerOperator,监听 Git 中 SchedulerConfig CR 的变化,自动调整集群调度器的 Preemption、NodeSelector 等参数。
  • 同步窗口管理:Operator 可以根据时间窗口(如业务低峰期)自动暂停/恢复 GitOps 同步,避免大版本更新影响在线服务。
最佳实践: 将 Operator 的 Reconciler 逻辑与 GitOps 同步周期解耦。Operator 专注于“确保 CR 定义的运行时状态”,GitOps 专注于“确保 CR 本身与 Git 一致”。两者通过 CR 作为契约接口。