Skip to content

🚀 Gitops avec Flux

Dans la continuité de l'intégration de Kubernetes avec GitLab, l'approche Gitops pour piloter ses environnements depuis Git et faire de Git la source concernant la topologie devient une norme. Dans ce cadre, GitLab a choisi d'intégrer FluxCD (plutôt que son concurrent ArgoCD).

Dans cette partie, nous allons voir rapidement comment initialiser cela et faire un premier déploiement en mode Gitops.

Pour se simplifier la tache, on va rester dans le projet utilisé à l'étape précédente : demo-kub

🧱 Initialisation de Flux

La documentation GitLab sur le sujet est plutôt bien faite.

En résumé, il faut:

  1. Installer la CLI flux sur votre poste
  2. Setter la variable d'environnement GITLAB_TOKEN avec votre personal access token
  3. Exécuter la commande d'initialisation de flux dans votre cluster
    • owner: le chemin vers votre projet
    • repository: le nom de votre projet, reprendre le projet créé précédemment demo-kub
    • path: le répertoire dans le projet dans lequel Flux va stocker les informations pour se synchroniser avec le cluster
      flux bootstrap gitlab \
      --hostname=gitlab.com \
      --owner=<group>/<subgroup> \
      --repository=<repository> \
      --branch=main \
      --path=clusters/demo \
      --deploy-token-auth
      

Success

kubectl get ns liste un nouveau namespace flux-system

Le résultat de la commande d'init
► connecting to https://gitlab.com
► cloning branch "main" from Git repository "https://gitlab.com/<group>/<subgroup>/demo-kub.git"
✔ cloned repository
► generating component manifests
✔ generated component manifests
✔ committed component manifests to "main" ("752836d098892bf55ee758f6af8fe3cb30e5ea8f")
► pushing component manifests to "https://gitlab.com/<group>/<subgroup>/demo-kub.git"
► installing components in "flux-system" namespace
✔ installed components
✔ reconciled components
► checking to reconcile deploy token for source secret
✔ configured deploy token "flux-system-main-flux-system-./clusters/demo" for "https://gitlab.com/<group>/<subgroup>/demo-kub"
► determining if source secret "flux-system/flux-system" exists
► generating source secret
► applying source secret "flux-system/flux-system"
✔ reconciled source secret
► generating sync manifests
✔ generated sync manifests
✔ committed sync manifests to "main" ("c310d0ec88c78802b90d7a6b97b292d7ee302f5c")
► pushing sync manifests to "https://gitlab.com/<group>/<subgroup>/demo-kub.git"
► applying sync manifests
✔ reconciled sync configuration
◎ waiting for GitRepository "flux-system/flux-system" to be reconciled
✔ GitRepository reconciled successfully
◎ waiting for Kustomization "flux-system/flux-system" to be reconciled
✔ Kustomization reconciled successfully
► confirming components are healthy
✔ helm-controller: deployment ready
✔ kustomize-controller: deployment ready
✔ notification-controller: deployment ready
✔ source-controller: deployment ready
✔ all components are healthy

On peut vérifier que Flux est bien configuré avec la commande kubectl get gitrepositories.source.toolkit.fluxcd.io -A

Success

  • le statut est à True
    NAMESPACE     NAME          URL                                             AGE    READY   STATUS
    flux-system   flux-system   https://gitlab.com/<group>/<subgroup>/demo-kub.git   5m8s   True    stored artifact for revision 'main@sha1:c310d0ec88c78802b90d7a6b97b292d7ee302f5c'
    

🎸 Déploiement d'une application

On va maintenant déployer une application en Gitops.

  1. Créer un répertoire infra à la racine du projet
  2. Dans ce répertoire, créer un fichier application.yml décrivant notre application, comme par exemple ce snippet
  3. Dans le répertoire clusters/demo créé par Flux, créer un nouveau répertoire demo-gitops
  4. Dans ce répertoire, créer un fichier demo-flux.yml et configurer les éléments pour Flux à l'aide de ce snippet
    • On configure 2 éléments :
      • le repository git à utiliser pour la synchronisation (ici le même que celui de flux, mais il peut être différent)
      • la kustomization flux précisant les éléments dans le repository cible, comme le chemin où sont stockées les fichiers descriptifs du déploiement
    • ⚠️ Bien mettre le bon chemin vers votre repository gitlab
  5. Commiter

Après quelques secondes

  • Un namespace demo-gitops est créé (contrôler via la commande kubectl get ns)
  • 3 pods sont créées dans ce namespace (contrôler via la commande kubectl get po -n demo-gitops)

L'intérêt du Gitops est de pouvoir contrôler via git son infrastructure.

  1. Modifier le fichier application.yml précédemment créé en réduisant le nombre de replicas de 2 à 3
  2. Commiter

Après quelques secondes

  • Il n'y a plus que 2 pods dans le namespace demo-gitops (contrôler via la commande kubectl get po -n demo-gitops)