WEBKT

ArgoCD 混合同步策略:实现镜像自动更新与关键变更人工审核的平衡之道

48 0 0 0

在 ArgoCD 中实现镜像自动更新跳过人工审核,同时又保留关键变更的人工审批,这在 GitOps 实践中是一个常见需求,旨在平衡部署效率和稳定性。本质上,你需要将“镜像更新”视为一种低风险、可信任的自动化操作,而“关键应用配置变更”则需要人工在代码层面进行审查。

以下是具体的配置思路与步骤:

1. 实现镜像自动更新并跳过 ArgoCD 内部审核

要让 ArgoCD 自动更新镜像并同步到集群,主要依赖两个核心组件:ArgoCD Image UpdaterArgoCD 应用的自动化同步策略

a. ArgoCD Image Updater 的作用

ArgoCD Image Updater 是一个独立的控制器,它负责监控容器镜像仓库,当发现新版本的镜像时(根据你定义的版本策略,如 semver, latest, digest 等),会自动修改你的 Git 仓库中的应用清单文件(例如 DeploymentStatefulSet 中的 image 标签),并提交一个新的 Git commit。

配置示例 (Image Updater):
你需要部署 ArgoCD Image Updater,并在你的 ArgoCD Application 资源中添加 argocd-image-updater.argoproj.io/image-list 注解来指定需要监控的镜像。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
  annotations:
    argocd-image-updater.argoproj.io/image-list: my-image=registry.example.com/my-repo/my-image
    argocd-image-updater.argoproj.io/my-image.update-strategy: semver
    argocd-image-updater.argoproj.io/my-image.allow-tags: ^v\d+\.\d+\.\d+$
    argocd-image-updater.argoproj.io/write-back-method: git
    argocd-image-updater.argoproj.io/git-branch: main # Image Updater会推送到这个分支
spec:
  project: default
  source:
    repoURL: https://github.com/your-org/your-app-gitops.git
    targetRevision: main
    path: k8s
  destination:
    server: https://kubernetes.default.svc
    namespace: my-app-prod
  syncPolicy:
    automated: # 开启自动化同步,这是让镜像更新自动生效的关键
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
  • argocd-image-updater.argoproj.io/image-list: 定义要更新的镜像。
  • argocd-image-updater.argoproj.io/my-image.update-strategy: 镜像更新策略,例如 semver(语义版本)。
  • argocd-image-updater.argoproj.io/write-back-method: git: 指定 Image Updater 将变更写入 Git 仓库。
  • argocd-image-updater.argoproj.io/git-branch: Image Updater 推送变更到的分支。

b. ArgoCD 应用的 Sync Policy (同步策略)

为了让 ArgoCD 在 Image Updater 更新 Git 仓库后立即自动同步这些变更,你需要在 Application 资源中配置 automated 同步策略:

  • spec.syncPolicy.automated.prune: true: 允许 ArgoCD 删除集群中不再存在于 Git 中的资源。
  • spec.syncPolicy.automated.selfHeal: true: 允许 ArgoCD 自动检测并修正集群中与 Git 仓库不一致的资源。这是实现镜像自动更新后“跳过人工 Review”的关键,因为 Image Updater 的 Git commit 会被 ArgoCD 自动检测并部署。

c. Webhook 设置

为了让 ArgoCD 尽快感知到 Image Updater 推送到 Git 仓库的变更(以及任何其他 Git 变更),你应该配置 Git 仓库的 Webhook,使其在每次 Git push 事件时通知 ArgoCD。

  1. 在 Git 服务商 (GitHub/GitLab/Gitee 等) 中配置 Webhook:

    • Payload URL: 指向你的 ArgoCD API Server 的 /api/webhook 端点。例如:https://argocd.your-domain.com/api/webhook
    • Secret (可选但推荐): 生成一个秘密令牌,并在 ArgoCD 中配置。
    • 事件类型: 至少选择 push 事件。
  2. 在 ArgoCD 中配置 Webhook secret (如果使用了 Secret):

    kubectl patch secret github-webhook-secret -p '{"stringData": {"webhook.secret": "你的WebhookSecret"}}' -n argocd
    

    或者创建一个新的 Secret:

    apiVersion: v1
    kind: Secret
    metadata:
      name: github-webhook-secret # 或gitlab-webhook-secret等
      namespace: argocd
    stringData:
      webhook.secret: "你的WebhookSecret"
    

    然后确保 ArgoCD Controller Pod 能够访问此 Secret。通常,ArgoCD 已经内置了对主流 Git 仓库的 Webhook 支持,你只需要配置 Secret 即可。

2. 保留关键变更的人工审核

“关键变更的人工审核”在这里指的是对 应用配置清单(而非仅镜像版本)的结构性或功能性修改 的审核。在 GitOps 模式下,这种审核通常发生在 Git Pull Request (PR) 流程 中。

  1. Git PR 流程作为审核入口:

    • 任何对应用 YAML 文件(例如添加新的 Kubernetes 资源、修改服务端口、调整 ConfigMap 内容等)的变更,都应该通过一个 Git Pull Request (PR) 提交。
    • 团队成员对 PR 进行代码审查,确保变更符合规范、没有引入潜在问题。
    • PR 被批准并合并到 ArgoCD 监控的目标分支(例如 mainmaster)后,变更才会被 GitOps 流程“接受”。
  2. ArgoCD 如何处理这些已审核的变更:

    • 由于你在 Application 资源中已经配置了 spec.syncPolicy.automated.selfHeal: trueprune: true,一旦这些经过 Git PR 审核并合并到目标分支的“关键变更”被 ArgoCD 检测到(通过 Webhook 或轮询),ArgoCD 会自动将它们同步到集群。
    • 关键点: ArgoCD 的 automated 同步策略是针对整个 Application 而言的,它无法区分是 Image Updater 提交的镜像更新还是人工合并的关键配置变更。只要 Git 仓库中的代码与集群状态不一致,且 selfHeal 开启,ArgoCD 都会尝试同步。因此,这里的“人工审核”必须前置到 Git PR 阶段

总结与最佳实践

  • 镜像更新: 通过 ArgoCD Image Updater 自动化修改 Git 仓库中的 image 标签,配合 ArgoCD Applicationautomated.selfHeal: trueprune: true 策略,实现无缝的自动部署。Git Webhook 确保 ArgoCD 实时响应这些变更。
  • 关键配置变更: 通过严格的 Git Pull Request (PR) 审核流程 进行控制。只有经过人工审查和批准的 PR 才能合并到 ArgoCD 监控的 Git 分支。一旦合并,ArgoCD 也会自动同步这些变更到集群。

这种策略的优点在于:

  • 效率与安全兼顾: 频繁的、低风险的镜像版本升级实现自动化,提高交付速度。
  • 风险控制: 高风险的配置变更通过 PR 流程得到充分人工审核,降低潜在错误。
  • GitOps 纯粹性: 保持 Git 作为所有配置的唯一真相来源,所有变更都有迹可循。

你需要清楚地认识到,在当前的 ArgoCD 设计中,automated.selfHeal 是一刀切的策略。如果你希望在 Git PR 审核之后,某些“关键变更”还需要在 ArgoCD UI 中进行 二次手动点击同步,而镜像更新则完全自动化,那么你可能需要更复杂的流程或拆分应用,例如:

  • 拆分 ArgoCD Application: 为应用的不同部分(例如只包含 Deployment 的镜像部分 vs. 包含所有其他配置的 ConfigMap、Service 等)创建不同的 ArgoCD Application 资源,并为它们配置不同的同步策略。但这会增加管理复杂性。
  • 自定义 CI/CD 流程: 禁用 ArgoCD 的 automated 同步,在 CI/CD 流程中,根据 Git commit 的类型(例如,如果是 Image Updater 提交的 commit 则触发自动同步,否则只在人工确认后才触发同步)。但这会偏离 ArgoCD 的核心自动化能力。

最推荐且符合 GitOps 精神的做法是:将所有“人工审核”前置到 Git PR 阶段,让 ArgoCD 始终保持与 Git 仓库的同步,无论是自动化提交的镜像更新还是人工提交的关键配置变更。

Ops老王 ArgoCDGitOps持续交付

评论点评