ArgoCD Image Updater, ou comment mettre à jour ses applications automatiquement sur Kubernetes

ArgoCD Image Updater, ou comment mettre à jour ses applications automatiquement sur Kubernetes

Publié le


Do not index
Do not index
Primary Keyword
Lié à Analyse sémantique (Articles liés) 1
Lié à Analyse sémantique (Articles liés)
Statut rédaction
A optimiser SEO
Lié à Analyse sémantique (Articles liés) 2
Commençons cet article par contextualiser ArgoCD Image Updater. Ensuite, nous pourrons répondre aux questions suivantes : qu’est-ce que c’est ? Comment le mettre en place ? Y a-t-il des choses supplémentaires à savoir ?

Contexte

Bienvenue chez TurboCorp, une entreprise du numérique qui distribue une application sous la forme d’un site Web et d’une API.
TurboCorp déploie son code de la manière suivante : le répertoire qui contient le code des applications inclue une pipeline de CI/CD. Cette pipeline se charge de construire et pousser des images Docker vers un registre dédié sur le cloud.
Une fois ces images mises à disposition, elles sont déployées sur un cluster Kubernetes en utilisant ArgoCD. Ce service utilise des fichiers de configuration pour créer des applications, et ensuite permet de les mettre à jour, les supprimer, et bien plus encore.
Pour mettre à jour les applications en production, au fur et à mesure des versions, UltraCorp modifie les fichiers de configuration pour monter les versions à la main. C’est long, fastidieux, et les erreurs sont très faciles à faire.

Présentation

C’est à ce moment qu’intervient ArgoCD Image Updater. Cette extension d’ArgoCD scrute des registres contenant des images Docker, et lorsque de nouvelles versions sont disponibles, met à jour les applications associées automatiquement.
Plusieurs modes de mise-à-jour sont disponibles, en utilisant du versionnage sémantique, en utilisant l’image la plus récente, etc.

Installation et mise en place

Nous considérons qu’une instance de ArgoCD est déjà déployée dans un namespace argocd, avec une application app déjà présente utilisant l’image app-backend:1.0.0, et que ArgoCD Image Updater sera déployé dans le même cluster.

Installation du service

Pour installer ArgoCD Image Updater, on peut utiliser la charte Helm officielle, et ce sans aucune configuration additionnelle. Pour ce faire, on peut lancer la commande suivante :
# Installation de ArgoCD Image Updater
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml

# C'est bien installé
$ kubectl get pods -n argocd | grep argocd-image-updater                                                                                                                                             infra-ref/scaleway keltio
argocd-image-updater-64ed9f48f-bj4zh               1/1     Running   0          37s

Configuration des accès aux registres

Maintenant que ArgoCD Image Updater est installé, il faut lui donner accès au registre qui contient les images Docker à utiliser. Pour ça, il faut créer un secret Kubernetes dans le namespace argocd qui contient un token d’authentification, et une ConfigMap qui indique quel secret utiliser pour quel registre.
Pour l’exemple, nous considérons les images app-backend et app-frontend hébergées sur DockerHub.
 

# Secret qui contient le token d'authentification
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: registries-credentials
  namespace: argocd
data:
  dockerhub: dXNlcjpwYXNzd29yZAo=  # user:password

---

# ConfigMap qui lie un registre à un secret
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-image-updater-config
data:
  registries.conf: |
    registries:
    - name: Docker Hub
      prefix: docker.io
      api_url: https://registry-1.docker.io
      credentials: secret:argocd/registries-credentials#dockerhub
      defaultns: library
      default: true
Maintenant que ArgoCD Image Updater est configué, on peut vérifier son fonctionnement et s’assurer qu’il peut bien accéder au registre :
$ kubectl exec -tn argocd argocd-image-updater-64ed9f48f-bj4zh -- \
	argocd-image-updater test app-backend \
		--registries-conf-path /app/config/registries.conf

time="2023-06-07T13:12:30Z" level=info msg="retrieving information about image" image_alias= image_name=app-backend registry_url=
time="2023-06-07T13:12:30Z" level=info msg="Loaded 1 registry configurations from /app/config/registries.conf"
time="2023-06-07T13:12:30Z" level=info msg="Fetching available tags and metadata from registry" application=test image_alias= image_name=app-backend registry_url=
time="2023-06-07T13:12:31Z" level=info msg="Found 2 tags in registry" application=test image_alias= image_name=app-backend registry_url=
time="2023-06-07T13:12:31Z" level=info msg="latest image according to constraint is app-backend:1.0.1" application=test image_alias= image_name=app-backend registry_url=
Super. ArgoCD Image Updater arrive bien à accéder à notre registre et à récupérer les versions disponibles.

Annotation et mise-à-jour des applications

Maintenant que cette partie là est terminée, il faut indiquer à ArgoCD que ses applications doivent être mises-à-jour automatiquement. Pour faire ça, il faut ajouter des annotations aux applications ArgoCD, et indiquer quelle image utiliser :
# Liste des applications
$ kubectl get -n argocd applications
NAME       SYNC STATUS   HEALTH STATUS
frontend   Synced        Healthy
backend    Synced        Healthy

# Version du backend
$ kubectl get -n argocd applications/backend -o yaml                                                                                                           infra-ref/scaleway immo-crypto
...
- forceString: true
  name: image.tag
  value: "1.0.0"

# `backend` est à mettre à jour automatiquement
$ kubectl annotate -n argocd applications/backend \
		argocd-image-updater.argoproj.io/image-list: app-backend

# Attendons puis regardons les logs
$ sleep 2m && kubectl logs -n argocd argocd-image-updater-64ed9f48f-bj4zh
...
time="2023-06-04T15:20:04Z" level=info msg="Starting image update cycle, considering 1 annotated application(s) for update"
time="2023-06-04T15:20:05Z" level=info msg="Processing results: applications=1 images_considered=1 images_skipped=0 images_updated=1 errors=0"

# Nouvelle version du backend
$ kubectl get -n argocd applications/backend -o yaml                                                                                                           infra-ref/scaleway immo-crypto
...
- forceString: true
  name: image.tag
  value: "1.0.1"
Et voilà, ArgoCD Image Updater a mis automatiquement l’application à jour. La prochaine fois qu’une nouvelle version de app-backend est poussée sur DockerHub, alors l’application sera mise-à-jour aussi quelques minutes après.

Notes supplémentaires

Instabilité

Il faut savoir que ArgoCD Image Updater est encore en développement actif, et que le projet n’est pas recommandé pour l’utilisation en production. Bien qu’il soit très stable et que nous l’utilisons, nous, sur notre infrastructure interne, c’est à vos risques et périls.

Rollback et synchronisation

Ce qui peut arriver lors d’une mise-à-jour, c’est que la nouvelle version rencontre des erreurs et qu’on veuille revenir à la version précédente. Pour ce faire, on peut simplement utiliser les fonctionnalités de ArgoCD.
Sur la page d’administration d’ArgoCD, sélectionner l’application à rollback, puis cliquer sur le bouton History and rollback dans la barre située en haut de l’écran. D’ici, on peut choisir le déploiement à utiliser.
La version utilisée est située dans les paramètres, dans le champ image.tag. Choisir la version à redéployer, et cliquer sur les trois points en haut à droite, et choisir Rollback.
 
Choix de la version, et rollback vers la version v1.1.1
Choix de la version, et rollback vers la version v1.1.1
Lorsqu’une nouvelle version est publiée, et que l’on veut remettre en place ArgoCD Image Updater, il faut ré-activer l’auto-synchronisation de l’application.
Pour faire ça, sélectionner l’application, puis descendre jusqu’en bas et cliquer sur Enable auto-sync. Il est recommandé également d’activer Prune resources ainsi que Self heal.

Conclusion

Dans cet article, nous avons présenté ArgoCD Image Updater. Cette extension d’ArgoCD se charge de mettre à jour automatiquement la version des images utilisées par les différentes applications déployées. Pour ce faire, il scrute en permanence des registres renseignés dans les configurations, et détecte dès qu’une nouvelle mise-à-jour est disponible.
Nous avons également vu comment configurer les accès à différents registres, et comment renseigner des identifiants pour ceux-ci.
Enfin, nous avons abordé les sujets plus critiques comme le rollback puis comment revenir à la dernière version disponible de l’application.
Nous espérons que cet article vous a plu, ArgoCD est une technologie que nous adorons, et cette extension vient le parfaire un peu plus !

S'inscrire à la newsletter DevSecOps Keltio

Pour recevoir tous les mois des articles d'expertise du domaine

S'inscrire

Écrit par

Victor Franzi
Victor Franzi

Victor est notre première recrue, il est passionné depuis son plus jeune âge et ne veut jamais s’arrêter d’apprendre 🧠