Skip to content

ArgoCD 与 FluxCD GitOps 实践对比

ArgoCD 与 FluxCD GitOps 实践对比

在传统的持续部署模式中,CI 系统(如 Jenkins / GitLab CI)通常采用 Push (推送) 模式:CI Runner 直接持有具备集群管理员权限的 kubeconfig 凭证,向生产 Kubernetes 集群执行 kubectl apply。这种模式存在致命的**权限泄露风险**,且当开发者在集群内部手动 kubectl edit 修改了资源后,CI 系统无法感知**配置漂移 (Config Drift)**。

GitOps 彻底颠覆了交付范式:将 Git 仓库作为系统期望状态的唯一定义源(Single Source of Truth),通过运行在集群内部的声明式同步引擎(Pull 模式)自动将实际状态拉齐至期望状态


一、传统 CI Push 模式 vs GitOps Pull 模式全景对比

graph TD
    subgraph Push_Model [传统 Push 模式: CI 持有全权集群凭证 -> 安全隐患大]
        Dev1[开发者 Git Push] --> CI1[CI 构建服务器]
        CI1 -->|持有生产 kubeconfig 跨防火墙主动调用| ProdCluster1[生产 K8s 集群]
    end

    subgraph Pull_Model [GitOps Pull 模式: 集群内 Agent 单向拉取 -> 零权限暴露]
        Dev2[开发者提交声明式 YAML/Helm/Kustomize] --> GitRepo["(Git 真实事实源仓库)"]
        GitRepo -.->|单向只读拉取| GitOpsAgent[运行在 K8s 内部的 ArgoCD Agent]
        GitOpsAgent -->|调和同步 (Reconcile) 并自动修正漂移| LiveCluster[K8s 本地 APIServer]
    end
核心特性 传统 CI/CD Push 模式 现代 GitOps Pull 模式 (ArgoCD / Flux)
K8s 访问凭证安全 生产集群的 kubeconfig 必须暴露存储在外部 CI 系统中 凭证完全保留在集群内部,外部 CI 仅需具有 Git 仓库写权限
网络防火墙穿透 生产集群必须对外部 CI 开放 6443 端口,暴露攻击面 **集群仅需对外发起单向 HTTPS/SSH 出网请求**拉取 Git,内网完全封闭
配置漂移检测 (Drift) ❌ 无法感知运维人员在生产集群的手动热改动 ✅ 毫秒级探测漂移并根据策略自动覆盖修复 (Self-Healing)
版本回滚能力 需重新触发复杂的 CI 构建流水线 只需执行 git revert,集群在一秒内自动回滚到上一历史版本

二、ArgoCD vs FluxCD 架构特性全方位对比

评测维度 ArgoCD FluxCD (Flux v2)
架构哲学 强调开箱即用、富 UI 界面与应用拓扑可视化 深度贯彻 Unix 哲学,由若干专用 K8s 微控制器(Source/Kustomize/Helm)组合
Web 控制台 UI 极其出色的内置 Web Dashboard,可视化展示全量 Pod 拓扑与日志 默认无官方重量级 UI(需配合第三方 UI 如 Weave GitOps)
多租户与 RBAC 内置丰富的 SSO 登录、多项目 Project 与细粒度 RBAC 权限体系 依托 Kubernetes 原生 RBAC 与 ServiceAccount 命名空间隔离
生态扩展组件 Argo Rollouts (蓝绿/金丝雀高级发布)、Argo Workflows Flagger (渐进式金丝雀交付)

三、ArgoCD 生产级 Application CRD 配置实战

# argocd/production-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: ecommerce-core-app
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io # 删除 Application 时级联安全清理底层资源
spec:
  project: default

  # 1. 期望状态源定义 (Source)
  source:
    repoURL: 'https://github.com/enterprise/k8s-manifests.git'
    targetRevision: main # 跟踪 main 分支
    path: environments/production # Kustomize / Helm 目录路径

  # 2. 目标集群定义 (Destination)
  destination:
    server: 'https://kubernetes.default.svc' # 部署至本地集群
    namespace: prod-apps

  # 3. 核心同步策略配置 (SyncPolicy)
  syncPolicy:
    automated:
      prune: true     # 自动清理在 Git 中已被删除的历史资源
      selfHeal: true  # 开启自愈:若有人手动 kubectl edit,自动被 Git 强行覆盖!
    syncOptions:
      - CreateNamespace=true
      - ApplyOutOfSyncOnly=true # 仅同步有差异的资源,避免全量重新 Apply 触发调度颠簸
    retry:
      limit: 5
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 3m

四、生产治理原则

  1. 应用代码与部署配置严格分仓 (App Repo vs Config Repo):业务源码仓库仅负责触发镜像构建并将新 Image Tag 自动提交至 Config Repo,由 GitOps 引擎感知部署变更。
  2. 敏感凭证防裸奔 (Secret Management):严禁在 Git 中提交明文 K8s Secret,必须结合 Sealed Secrets(非对称加密)或 External Secrets Operator 对接 HashiCorp Vault。