使用 ArgoCD 根据 Docker 镜像的 latest 标签实现自动同步

173次阅读
没有评论

问题描述

在使用 ArgoCD 时,用户希望能够在 Docker 镜像的特定标签(如 latest 或 stable)更新时,实现应用的自动同步更新/部署。举例来说,用户在 Git 仓库中有如下部署配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-nginx-example
spec:
  selector:
    matchLabels:
      app: k8s-nginx-example
  replicas: 2
  template:
    metadata:
      labels:
        app: k8s-nginx-example
    spec:
      containers:
        - name: nginx
          image: my-repo/k8s-nginx-example:latest
          ports:
            - containerPort: 80
          resources:
            requests:
              memory: "64Mi"
              cpu: "250m"
            limits:
              memory: "128Mi"
              cpu: "500m"

用户希望当新的 Docker 镜像被推送到 latest 或 stable 标签时,ArgoCD 能够自动更新该部署。然而,目前 ArgoCD 是每隔 3 秒轮询 Git 仓库,因此不会意识到 Docker 镜像标签的变化。另一种可能的选项是通过 Webhook 的方式通知 ArgoCD 存在新的镜像需要拉取,但即使在推送了 Docker 镜像到仓库的 latest 标签,并手动在 ArgoCD 中执行了同步操作,ArgoCD 也没有做任何操作。这可能是因为 ArgoCD 只关注 Git 仓库的变化,而不关心部署中的 Docker 镜像。

用户目前唯一想到的解决方法是在 Docker 镜像中使用版本标签(如 1.2.3),然后通过脚本自动更新 Git 仓库中部署配置中的镜像标签。用户想知道是否有办法在 ArgoCD 中实现这个需求,或者是否使用 Argo Workflows 和 Argo Events 会是一个更好的选择。用户还希望是否存在插件或其他方法,能够触发事件或监控 Docker 镜像的变化。

解决方案

根据问题描述,你可以考虑以下两种方案来实现在 ArgoCD 中根据 Docker 镜像的 latest 标签实现自动同步:

方案1: 使用 Keel 来管理镜像更新

Keel 是一个轻量级的工具,可用于在集群中管理 Docker 镜像的更新。你可以通过在部署配置中添加一些注释来实现 Keel 的自动更新。以下是一个示例的部署配置:

metadata:
  annotations:
    keel.sh/policy: force
    keel.sh/trigger: poll
    keel.sh/pollSchedule: "@every 10m"

在上述示例中,我们在部署配置的 metadata 下添加了一些注释,用于指示 Keel 如何处理镜像的更新。keel.sh/policy: force 表示强制更新,keel.sh/trigger: poll 表示使用轮询触发更新,keel.sh/pollSchedule: "@every 10m" 表示每隔 10 分钟轮询一次。

请注意,如果你将系统用于生产环境,最好避免使用 latest 标签。因为 latest 标签可能会在推送了不兼容变更时导致问题。Keel 可以通过对语义化版本标签的理解来处理这一问题,允许你在次要版本变更时更新,但避免在主要版本变更时进行更新。

方案2: 使用 ArgoCD Image Updater

ArgoCD Image Updater 是一个与 ArgoCD 集成的工具,用于实现镜像的自动更新。你可以查阅 ArgoCD Image Updater 的文档来了解更多细节。该工具目前正在逐步纳入 ArgoCD 的官方支持中。

你可以通过在部署配置中添加相关注释或配置,来让 ArgoCD Image Updater 在镜像更新时自动同步部署。

综上所述,你可以根据上述两种方案之一来实现在 ArgoCD 中根据 Docker 镜像的 latest 标签实现自动同步。选择哪种方案取决于你的需求和偏好。希望这些方案对你有所帮助!

正文完