Configure ArgoCD Image Updater for automated container deployments

Intermediate 25 min Jun 10, 2026 18 views
Ubuntu 24.04 Debian 12 AlmaLinux 9 Rocky Linux 9

Set up ArgoCD Image Updater to automatically detect and deploy new container image versions in your GitOps workflow. Includes Git repository integration, webhook configuration, and monitoring setup.

Prerequisites

  • Existing Kubernetes cluster
  • ArgoCD already installed
  • Git repository with Kubernetes manifests
  • kubectl configured for cluster access

What this solves

ArgoCD Image Updater automatically monitors container registries for new image versions and updates your Kubernetes manifests in Git repositories. This eliminates manual image version updates while maintaining GitOps principles and audit trails.

Step-by-step installation

Update system packages

Ensure your package manager has the latest package information before installing dependencies.

sudo apt update && sudo apt upgrade -y
sudo dnf update -y

Install kubectl and required tools

Install kubectl for Kubernetes cluster interaction and curl for API calls.

sudo apt install -y curl git
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
sudo dnf install -y curl git
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

Verify ArgoCD installation

Confirm that ArgoCD is already running in your cluster. ArgoCD Image Updater requires an existing ArgoCD installation.

kubectl get pods -n argocd
kubectl get svc -n argocd
Note: This tutorial assumes you have ArgoCD already installed. If not, check out our ArgoCD installation guide first.

Create ArgoCD Image Updater namespace and RBAC

Set up the namespace and service account with appropriate permissions for the Image Updater to function.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: argocd-image-updater
  namespace: argocd
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: argocd-image-updater
rules:
  • apiGroups:
- "" resources: - secrets - configmaps verbs: - get - list - watch
  • apiGroups:
- argoproj.io resources: - applications - appprojects verbs: - get - list - update - patch - watch
  • apiGroups:
- "" resources: - events verbs: - create --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: argocd-image-updater roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: argocd-image-updater subjects:
  • kind: ServiceAccount
name: argocd-image-updater namespace: argocd
kubectl apply -f /tmp/argocd-image-updater-rbac.yaml

Deploy ArgoCD Image Updater

Install the Image Updater deployment with the latest stable version from the official repository.

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml

Configure Image Updater settings

Create a ConfigMap with global configuration settings for the Image Updater behavior and logging.

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-image-updater-config
  namespace: argocd
data:
  registries.conf: |
    registries:
    - name: Docker Hub
      api_url: https://registry-1.docker.io
      prefix: docker.io
      ping: yes
      credentials: secret:argocd/docker-registry#creds
      credsexpire: 10h
    - name: Quay
      api_url: https://quay.io
      prefix: quay.io
      ping: yes
    - name: GitHub Container Registry
      api_url: https://ghcr.io
      prefix: ghcr.io
      ping: yes
  git.conf: |
    git:
      user: argocd-image-updater
      email: argocd-image-updater@example.com
  log.conf: |
    log:
      level: info
kubectl apply -f /tmp/argocd-image-updater-config.yaml

Create Git repository access secret

Configure credentials for the Image Updater to commit changes back to your Git repository.

kubectl create secret generic git-credentials \
  --from-literal=username=your-git-username \
  --from-literal=password=your-git-token \
  -n argocd

kubectl label secret git-credentials \
  "argocd.argoproj.io/secret-type=repo-creds" \
  -n argocd
Security: Replace your-git-username and your-git-token with your actual Git credentials. Use a personal access token, not your password, for better security.

Configure container registry credentials

Set up authentication for private container registries that require credentials.

kubectl create secret generic docker-registry \
  --from-literal=creds=username:password \
  -n argocd

kubectl label secret docker-registry \
  "argocd.argoproj.io/secret-type=repository" \
  -n argocd

Configure image update automation

Annotate ArgoCD Application for automatic updates

Add annotations to your existing ArgoCD Application to enable automatic image updates.

kubectl patch application my-app -n argocd --type merge --patch '{
  "metadata": {
    "annotations": {
      "argocd-image-updater.argoproj.io/image-list": "myapp=docker.io/myuser/myapp:latest",
      "argocd-image-updater.argoproj.io/write-back-method": "git",
      "argocd-image-updater.argoproj.io/git-branch": "main"
    }
  }
}'

Configure update strategy

Define how the Image Updater should determine which new versions to deploy.

kubectl patch application my-app -n argocd --type merge --patch '{
  "metadata": {
    "annotations": {
      "argocd-image-updater.argoproj.io/myapp.update-strategy": "semver",
      "argocd-image-updater.argoproj.io/myapp.allow-tags": "regexp:^v[0-9]+\\.[0-9]+\\.[0-9]+$",
      "argocd-image-updater.argoproj.io/myapp.ignore-tags": "latest,dev,staging"
    }
  }
}'

Enable Helm chart image updates

For Helm-based applications, configure the Image Updater to modify Helm values.

kubectl patch application my-helm-app -n argocd --type merge --patch '{
  "metadata": {
    "annotations": {
      "argocd-image-updater.argoproj.io/image-list": "myapp=docker.io/myuser/myapp",
      "argocd-image-updater.argoproj.io/write-back-method": "git",
      "argocd-image-updater.argoproj.io/myapp.helm.image-name": "image.repository",
      "argocd-image-updater.argoproj.io/myapp.helm.image-tag": "image.tag"
    }
  }
}'

Set up Git repository integration

Configure Git write-back settings

Set up how the Image Updater commits changes back to your Git repository with proper commit messages.

kubectl patch configmap argocd-image-updater-config -n argocd --patch '{
  "data": {
    "git.conf": "git:\n  user: argocd-image-updater\n  email: argocd-image-updater@example.com\n  commit_user: ArgoCD Image Updater\n  commit_email: argocd-image-updater@example.com\n  commit_message_template: |\n    build: automatic update of {{ .AppName }}\n    \n    {{ range .AppChanges -}}\n    updates image {{ .Image }} tag '{{ .OldTag }}' to '{{ .NewTag }}'\n    {{ end -}}"
  }
}'

Configure webhook notifications

Set up webhook notifications to receive updates when images are automatically updated.

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-image-updater-config
  namespace: argocd
data:
  webhooks.conf: |
    webhooks:
    - name: slack
      url: https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
      method: POST
      headers:
        Content-Type: application/json
      template: |
        {
          "text": "Image updated: {{ .AppName }}",
          "attachments": [
            {
              "color": "good",
              "fields": [
                {{ range .AppChanges -}}
                {
                  "title": "{{ .Image }}",
                  "value": "{{ .OldTag }} → {{ .NewTag }}",
                  "short": true
                }{{ if not (last .) }},{{ end }}
                {{ end -}}
              ]
            }
          ]
        }
kubectl patch configmap argocd-image-updater-config -n argocd --patch-file /tmp/webhook-config.yaml

Configure update schedules

Set up cron-based schedules for when the Image Updater should check for new images.

kubectl patch application my-app -n argocd --type merge --patch '{
  "metadata": {
    "annotations": {
      "argocd-image-updater.argoproj.io/myapp.update-schedule": "0 2   *",
      "argocd-image-updater.argoproj.io/myapp.platforms": "linux/amd64,linux/arm64"
    }
  }
}'

Monitor and troubleshoot deployments

Enable detailed logging

Configure verbose logging to help with troubleshooting and monitoring update activities.

kubectl patch deployment argocd-image-updater -n argocd --patch '{
  "spec": {
    "template": {
      "spec": {
        "containers": [
          {
            "name": "argocd-image-updater",
            "args": [
              "--interval", "2m",
              "--loglevel", "debug",
              "--metrics-port", "8080",
              "--health-probe-port", "8081",
              "--argocd-server-addr", "argocd-server.argocd.svc.cluster.local:443",
              "--insecure"
            ]
          }
        ]
      }
    }
  }
}'

Set up Prometheus metrics

Enable metrics collection for monitoring the Image Updater performance and activity.

apiVersion: v1
kind: Service
metadata:
  name: argocd-image-updater-metrics
  namespace: argocd
  labels:
    app.kubernetes.io/component: image-updater
    app.kubernetes.io/name: argocd-image-updater
    app.kubernetes.io/part-of: argocd
spec:
  ports:
  - name: metrics
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app.kubernetes.io/name: argocd-image-updater
kubectl apply -f /tmp/metrics-service.yaml

Create ServiceMonitor for Prometheus

Set up automatic metrics scraping if you have Prometheus Operator installed.

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: argocd-image-updater
  namespace: argocd
  labels:
    app.kubernetes.io/component: image-updater
    app.kubernetes.io/name: argocd-image-updater
spec:
  endpoints:
  - interval: 30s
    path: /metrics
    port: metrics
  namespaceSelector:
    matchNames:
    - argocd
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-image-updater
kubectl apply -f /tmp/servicemonitor.yaml

Verify your setup

kubectl get pods -n argocd | grep image-updater
kubectl logs -n argocd deployment/argocd-image-updater
kubectl get applications -n argocd -o json | jq '.items[].metadata.annotations | select(. != null) | to_entries[] | select(.key | contains("argocd-image-updater"))'
curl -s http://localhost:8080/metrics | grep argocd_image_updater

Check that your application has the correct annotations:

kubectl describe application my-app -n argocd | grep -A 10 Annotations

Common issues

Symptom Cause Fix
Image Updater pod not starting Missing RBAC permissions Verify ClusterRole and ClusterRoleBinding are applied correctly
No image updates happening Incorrect application annotations Check annotation syntax and ensure image-list matches your container registry
Git commits failing Invalid Git credentials Verify git-credentials secret has correct username and token
Registry authentication errors Missing or invalid registry credentials Create proper docker-registry secret with valid credentials
Webhook notifications not working Incorrect webhook URL or format Test webhook URL manually and verify JSON template syntax
Metrics not available Metrics port not exposed Ensure deployment args include --metrics-port 8080 and service is created

Next steps

Running this in production?

Need this managed? Setting up ArgoCD Image Updater once is straightforward. Keeping it patched, monitored, backed up and tuned across environments is the harder part. See how we run infrastructure like this for European teams.

Automated install script

Run this to automate the entire setup

Need help?

Don't want to manage this yourself?

We handle managed devops services for businesses that depend on uptime. From initial setup to ongoing operations.