[Book] [OK!] 7.5 Image Updater


Задача:
С помощью Argo CD обновлять tag в манифестах, как только в registry появится новая версия


Делаю:
2025.12.04


Подготовительные шаги

1. Создать токен для работы с repo

https://github.com/settings/tokens


Или можно кликать по иконкам:

GithubUserName -> Settings -> Developer Settings -> Personal access token -> Tokens (classic) ->


Genereate new token (classic) -> ARGO_TOKEN


$ cat << 'EOF' | kubectl create -f -
apiVersion: v1
kind: Secret
metadata:
  name: github-secret
  namespace: argocd
  annotations:
    tekton.dev/git-0: https://github.com
type: kubernetes.io/basic-auth
stringData:
  username: YOUR_USERNAME
  password: YOUR_PASSWORD
EOF


YOUR_USERNAME - github username
YOUR_PASSWORD - GitHub personal access token


2. Развернуть приложение


Из-за блокировок на скачивание с quay.io, перекладываю image к себе в бесплатных облаках google-cloud-shell.


$ docker pull quay.io/rhdevelopers/bgd


$ docker login -u webmakaka
$ docker tag quay.io/rhdevelopers/bgd webmakaka/bgd:1.0.0
$ docker push webmakaka/bgd:1.0.0


gitops-cookbook-sc/ch07/bgdui/base/bgd-deployment.yaml


containers:
  - image: webmakaka/bgd:1.0.0


$ cat << 'EOF' | kubectl apply -f -
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: bgdk-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/wildmakaka/gitops-cookbook-sc.git
    targetRevision: main
    path: ch07/bgdui/bgdk
  destination:
    server: https://kubernetes.default.svc
    namespace: bgdk
  syncPolicy:
    automated:
      selfHeal: true
      prune: true
      allowEmpty: true
EOF


$ argocd app sync bgdk-app


(Можно пропустить) Посмотреть на задеплоенное приложение


$ kubectl patch svc bgd -n bgdk -p '{"spec": {"type": "NodePort"}}'


$ kubectl get services -n bgdk
NAME   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
bgd    NodePort   10.100.62.50   <none>        8080:32538/TCP   3m21s


$ MINIKUBE_IP=$(minikube --profile ${PROFILE} ip)
$ echo $MINIKUBE_IP


$ APP_NODE_PORT=$(kubectl get svc bgd -n bgdk -o jsonpath='{.spec.ports[?(@.port==8080)].nodePort}')


// [OK!]
$ echo http://$MINIKUBE_IP:$APP_NODE_PORT


Устанавливаю argocd-image-updater


https://github.com/argoproj-labs/argocd-image-updater


https://argocd-image-updater.readthedocs.io/en/stable/basics/update-methods/


С версии v1.0.0 Image Updater перешел на использование отдельных ImageUpdater CRD, а не аннотаций в Application ресурсах.


$ helm repo add argo https://argoproj.github.io/argo-helm


$ helm install argocd-image-updater argo/argocd-image-updater \
 --namespace argocd \
 --set argocd.insecure=true


$ kubectl get crd | grep imageupdater
imageupdaters.argocd-image-updater.argoproj.io   2025-12-04T02:17:18Z


Запуск примера


// Выполнение следующего манифеста должно прописать в файл gitops-cookbook-sc/ch07/bgdui/bgdk/.argocd-source-bgdk-app.yaml webmakaka/bgd:18.0.0


$ cat << 'EOF' | kubectl apply -f -
apiVersion: argocd-image-updater.argoproj.io/v1alpha1
kind: ImageUpdater
metadata:
  name: bgdk-image-updater
  namespace: argocd
spec:
  namespace: argocd
  writeBackConfig:
    method: git:secret:argocd/github-secret
    gitConfig:
      repository: https://github.com/wildmakaka/gitops-cookbook-sc.git
      branch: main
  applicationRefs:
    - namePattern: bgdk-app
      images:
        - alias: bgd
          imageName: webmakaka/bgd:18.0.0
EOF


// Выполнение следующего манифеста должно прописать в файл gitops-cookbook-sc/ch07/bgdui/bgdk/.argocd-source-bgdk-app.yaml версию, которая появилась в registry


$ docker tag quay.io/rhdevelopers/bgd webmakaka/bgd:20.0.0
$ docker push webmakaka/bgd:20.0.0


$ cat << 'EOF' | kubectl apply -f -
apiVersion: argocd-image-updater.argoproj.io/v1alpha1
kind: ImageUpdater
metadata:
  name: bgdk-image-updater
  namespace: argocd
spec:
  namespace: argocd
  commonUpdateSettings:
    updateStrategy: semver
  writeBackConfig:
    method: git:secret:argocd/github-secret
    gitConfig:
      repository: https://github.com/wildmakaka/gitops-cookbook-sc.git
      branch: main
  applicationRefs:
    - namePattern: bgdk-app
      images:
        - alias: bgd
          imageName: webmakaka/bgd
EOF


В результате в репо версия обновилась. Спустя 2 минут и на сервер приехала обновленна версия image.


Проверим созданные ресурсы

$ kubectl get secret github-secret -n argocd
$ kubectl get application bgdk-app -n argocd
$ kubectl get imageupdater bgdk-image-updater -n argocd


// Получить логи
$ POD_NAME=$(kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-image-updater -o name)
$ kubectl logs -n argocd $POD_NAME --tail=20