Aller au contenu

Kargo, déployez d'un environnement à l'autre en mode GitOps

·7 mins
gitops argocd container git kargo cd helm kustomize yaml
Romain Boulanger
Auteur
Romain Boulanger
Ingénieur DevSecOps et Architecte Cloud
Sommaire

Cet article a été réalisé avec la version 0.3.1 de Kargo.

Introduction
#

Je vous avais présenté le mois dernier Flamingo qui combine à la fois Argo CD et Flux CD pour tirer parti de ces deux outils et adopter une approche GitOps.

Néanmoins, le GitOps ou les outils ci-dessus ne définissent pas de moyen pour promouvoir les changements qui ont été apportés d’un environnement de développement à un environnement de qualification ou de production.

En effet, Argo CD et Flux CD se chargent de déployer un ou plusieurs environnements cibles sans aucun lien, ni relation entre eux.

Il est toutefois possible d’adopter un Branching Model pour promouvoir ces changements. Si ce terme ne vous parle pas, je vous recommande de consulter cet article.

Heureusement, une solution est apparue il y a quelques mois, même si cette dernière est encore en phase de développement et donc, pas encore prêt pour être utilisée en production, je vous propose dans cet article un tour d’horizon du potentiel de cet outil.

Kargo, la solution
#

Qui n’a jamais rêvé d’appuyer sur un bouton pour porter les modifications d’un environnement à un autre ? L’exemple le plus classique est une nouvelle image de conteneur que l’on teste sur un environnement de développement avant de la déployer sur un environnement de qualification.

C’est exactement ce que permet de faire Kargo, même si ce dernier permet d’aller encore plus loin que la gestion de version des images, il est capable d’appliquer les différences de configurations de vos objets Kubernetes.

De plus, Kargo fait partie de l’Argo Project (la même famille qu’Argo CD) et est un outil 100% open source.

De manière synthétique, Kargo est une plateforme de livraison continue qui permet d’orchestrer le cycle de vie des applications sur Kubernetes d’un environnement à l’autre en s’appuyant sur des outils existants.

Eh oui, Kargo travaille en lien direct avec Argo CD où ce dernier s’occupe de ce qu’il sait faire le mieux : déployer les objets Kubernetes.

Fonctionnalités
#

Bien que Kargo soit un outil encore très jeune, il est doté de plusieurs fonctionnalités :

  • Promotion de configurations ou d’images conteneurisées d’un environnement à l’autre ;
  • Écriture des changements dans Git : Dès qu’un changement est approuvé, Kargo se charge de générer une Pull Request et commit les modifications ;
  • Possibilité d’effectuer des retours en arrière en cas d’erreur ;
  • Création de tests pour valider le bon fonctionnement d’un environnement notamment avec Argo Rollouts ;
  • Le Canary et l’A/B testing peuvent être utilisés pour déployer sur un environnement cible.

Cette liste est sujette à évoluer dans les futures version de Kargo. En effet, l’équipe a pour objectif de faire grandir le produit dans des versions futures jusqu’à atteindre une première version majeure (1.0.0) afin de susciter l’adoption de Kargo dans des environnements de production.

Kargo dispose d’une interface utilisateur qui permet de suivre les changements en un coup d’oeil :

Interface de Kargo

Cette interface permet aussi de visualiser les images ou configurations associées aux environnements définis. Ce qui permet notamment d’avoir un historique et d’auditer l’ensemble des actions au sein de Kargo.

Enfin, la grande barre noire du haut s’appelle la ligne de fret (Freight) comme pour le transport de marchandise. Vous avez compris le rapport avec Kargo maintenant, non ?

Fonctionnement
#

C’est le moment de discuter du fonctionnement de Kargo et comment ce dernier opère la gestion des environnements notamment dès lors qu’une nouvelle version d’image est disponible.

Workflow avec Kargo

Voici le déroulement des opérations dans l’ordre :

  1. La CI, quelle que soit la plateforme, crée une nouvelle image de conteneur ;
  2. Cette dernière est déposée dans un registre de conteneurs ;
  3. En fonction des configurations définies, Kargo vient analyser le dépôt Git contenant les objets Kubernetes (1) et recherche les potentielles nouvelles images (2) associées ;
  4. En fonction des nouvelles images récupérées, le développeur a le choix de promouvoir ou non ces changements sur le premier environnement configuré, qui sera développement dans ce cas-ci ;
  5. Une fois la validation du développeur, Kargo pousse les modifications dans Git ;
  6. Avec l’action précédente, Argo CD se déclenche et détecte une mise à jour des fichiers de l’environnement de développement ;
  7. Argo CD synchronise les changements sur le cluster Kubernetes ;
  8. Kargo récupère l’état des objets déployés et permet d’effectuer des tests ;
  9. Si tout est bon, le développeur a la possibilité d’approuver les changements pour l’environnement suivant.

Du côté de l’installation, Kargo se déploie de préférence avec un chart Helm et il est recommandé de le disposer au plus proche d’Argo CD car il est en interaction directe avec ce dernier.

Vous l’aurez compris, Kargo permet de chaîner un ou plusieurs environnements en fonction de votre cycle de déploiement. Ces environnements sont matérialisés en objet Kubernetes du nom de Stage :

apiVersion: v1
kind: Namespace
metadata:
  name: kargo-demo
  labels:
    kargo.akuity.io/project: "true"
---
apiVersion: kargo.akuity.io/v1alpha1
kind: Warehouse
metadata:
  name: docker-registry
  namespace: kargo-demo
spec:
  subscriptions:
  - image:
      repoURL: nginx
      semverConstraint: ^1.24.0
---
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
  name: dev
  namespace: kargo-demo
spec:
  subscriptions:
    warehouse: docker-registry
  promotionMechanisms:
    gitRepoUpdates:
    - repoURL: ${GITOPS_REPO_URL}
      writeBranch: main
      kustomize:
        images:
        - image: nginx
          path: overlays/dev
    argoCDAppUpdates:
    - appName: nginx-dev
      appNamespace: argocd

Voici un exemple pour générer un environnement de dev au sein de Kargo. Celui-ci est composé de plusieurs dossiers Kustomize base, overlays/dev, overlays/uat et overlays/prod pour référencer les configurations propres à chaque environnements. À savoir que ce dépôt de code déploie un simple Deployment contenant une image nginx.

Si vous souhaitez reproduire ça chez vous, je vous conseille d’utiliser sur cet exemple qui fournit la démarche à suivre pour tester Kargo.

J’ai fait quelques petites modifications par rapport à la version de base. En effet, plutôt que de créer une branche pour chaque environnement, j’utilise la branche principale avec le paramètre writeBranch: main.

Comme vous pouvez le constater, l’environnement dev écoute sur un objet Warehouse docker-regitry qui récupère les nouvelles images nginx en suivant la contrainte semver associée (^1.24.0). Par ailleurs, le bloc argoCDAppUpdates fait la jonction avec Argo CD qui orchestre le déploiement une fois les changements approuvés.

À noter que la création d’un Namespace avec le label kargo.akuity.io/project: "true" est indispensable pour référencer le projet kargo-demo au sein de l’outil.

Je vous ai présenté le lien entre un registre d’images et un environnement de développement. Évidemment, il est possible d’aller plus loin et d’ajouter des environnements à la suite de cette manière, toujours sous forme de stages.

apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
  name: uat
  namespace: kargo-demo
spec:
  subscriptions:
    upstreamStages:
    - name: dev
  promotionMechanisms:
    gitRepoUpdates:
    - repoURL: ${GITOPS_REPO_URL}
      writeBranch: main
      kustomize:
        images:
        - image: nginx
          path: overlays/uat
    argoCDAppUpdates:
    - appName: nginx-uat
      appNamespace: argocd
---
apiVersion: kargo.akuity.io/v1alpha1
kind: Stage
metadata:
  name: prod
  namespace: kargo-demo
spec:
  subscriptions:
    upstreamStages:
    - name: uat
  promotionMechanisms:
    gitRepoUpdates:
    - repoURL: ${GITOPS_REPO_URL}
      writeBranch: main
      kustomize:
        images:
        - image: nginx
          path: overlays/prod
    argoCDAppUpdates:
    - appName: nginx-prod
      appNamespace: argocd

Voici à quoi devrait ressembler votre pipeline Kargo :

Une Pipeline sur Kargo

Le mécanisme de promotion peut s’effectuer directement depuis l’interface ou en ligne de commande :

La promotion au sein de Kargo

Comme dit plus haut, la promotion viendra effectuer un commit directement dans votre dépôt de code et aura comme effet de déclencher le déploiement au sein d’Argo CD :

GitHub diff

Kargo avec Argo CD

Il est totalement possible de poursuivre et de mettre à jour les environnements suivants en effectuant les mêmes étapes pour uat et prod.

Pour finir, Kargo permet de travailler avec plusieurs types de sources au sein de l’objet Warehouse, c’est le cas des registres d’images, dépôt de code Git ou encore des registres de charts Helm.

Quelques mots pour conclure
#

Plutôt que de bidouiller une chaîne CI/CD à base de diff et de sed pour promovoir vos changements, Kargo apporte avec lui un manque souvent exprimé quand on parle d’outils GitOps : l’orchestration entre environnements.

Encore une fois, Kargo est encore très jeune, mais je trouve personnellement qu’il a un grand potentiel. Quitte à être, plus tard, indispensable avec toute installation d’Argo CD.

N’hésitez pas à suivre les versions et mises à jour de Kargo sur le GitHub.

Articles connexes

Approche GitOps avec Flamingo, le meilleur des deux mondes
·8 mins
gitops flamingo flux argocd cd kubernetes
Argo CD, la gestion simplifiée de vos déploiements sur Kubernetes
·7 mins
ci/cd automation code argocd kubernetes docker helm yaml
Mettre à l'échelle facilement sur Kubernetes avec Keda
·7 mins
kubernetes keda yaml rabbitmq scale cron helm