[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