ArgoCD 混合同步策略:实现镜像自动更新与关键变更人工审核的平衡之道
在 ArgoCD 中实现镜像自动更新跳过人工审核,同时又保留关键变更的人工审批,这在 GitOps 实践中是一个常见需求,旨在平衡部署效率和稳定性。本质上,你需要将“镜像更新”视为一种低风险、可信任的自动化操作,而“关键应用配置变更”则需要人工在代码层面进行审查。
以下是具体的配置思路与步骤:
1. 实现镜像自动更新并跳过 ArgoCD 内部审核
要让 ArgoCD 自动更新镜像并同步到集群,主要依赖两个核心组件:ArgoCD Image Updater 和 ArgoCD 应用的自动化同步策略。
a. ArgoCD Image Updater 的作用
ArgoCD Image Updater 是一个独立的控制器,它负责监控容器镜像仓库,当发现新版本的镜像时(根据你定义的版本策略,如 semver, latest, digest 等),会自动修改你的 Git 仓库中的应用清单文件(例如 Deployment 或 StatefulSet 中的 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。
在 Git 服务商 (GitHub/GitLab/Gitee 等) 中配置 Webhook:
- Payload URL: 指向你的 ArgoCD API Server 的
/api/webhook端点。例如:https://argocd.your-domain.com/api/webhook。 - Secret (可选但推荐): 生成一个秘密令牌,并在 ArgoCD 中配置。
- 事件类型: 至少选择
push事件。
- Payload URL: 指向你的 ArgoCD API Server 的
在 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) 流程 中。
Git PR 流程作为审核入口:
- 任何对应用 YAML 文件(例如添加新的 Kubernetes 资源、修改服务端口、调整 ConfigMap 内容等)的变更,都应该通过一个 Git Pull Request (PR) 提交。
- 团队成员对 PR 进行代码审查,确保变更符合规范、没有引入潜在问题。
- PR 被批准并合并到 ArgoCD 监控的目标分支(例如
main或master)后,变更才会被 GitOps 流程“接受”。
ArgoCD 如何处理这些已审核的变更:
- 由于你在
Application资源中已经配置了spec.syncPolicy.automated.selfHeal: true和prune: true,一旦这些经过 Git PR 审核并合并到目标分支的“关键变更”被 ArgoCD 检测到(通过 Webhook 或轮询),ArgoCD 会自动将它们同步到集群。 - 关键点: ArgoCD 的
automated同步策略是针对整个Application而言的,它无法区分是Image Updater提交的镜像更新还是人工合并的关键配置变更。只要 Git 仓库中的代码与集群状态不一致,且selfHeal开启,ArgoCD 都会尝试同步。因此,这里的“人工审核”必须前置到 Git PR 阶段。
- 由于你在
总结与最佳实践
- 镜像更新: 通过
ArgoCD Image Updater自动化修改 Git 仓库中的image标签,配合 ArgoCDApplication的automated.selfHeal: true和prune: 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 仓库的同步,无论是自动化提交的镜像更新还是人工提交的关键配置变更。