Introduction

FluxCD est un outil permettant de garder synchronisé un cluster Kubernetes avec la description de sa configuration (par exemple contenue dans un dépôt Git).

Cela suit donc les principes GitOps .

Compréhension

Avant tout, FluxCD fonctionne sur Kubernetes : il apporte des CRD (Custom Resource Definition) à Kubernetes.

C’est ce qui permet de dĂ©clarer des ressources via les manifestes Kubernetes habituels (des fichiers .yaml).

Sources possibles

Flux va pouvoir surveiller au regard des sources suivantes :

Grâce à ce système, on peut déclarer un dépôt Git à surveiller.

Flux a besoin :

Depuis où les ressources ?

Pour pouvoir fonctionner, FluxCD proppose :

Fonctionnement du bootstrap

L’idĂ©e est d’initialiser un dĂ©pĂ´t Git qui sera pris comme rĂ©fĂ©rence par un cluster Kubernetes pour dĂ©ployer des services.

Il existe des tutoriels du Bootstrap FluxCD pour différents types de dépôt Git .

Par exemple pour Gitlab, cela donnerait :

# Vérification d'accès au Cluster Kubernetes
kubectl get nodes
# Notre clé d'accès personnelle Gitlab (PAT)
export GITLAB_TOKEN=<gl-token>
# Lien entre le dépôt Gitlab et notre cluster
flux bootstrap gitlab \
  --deploy-token-auth \
  --owner=my-gitlab-username \
  --repository=my-project \
  --branch=master \
  --path=clusters/my-cluster \
  --personal

Ainsi, dans l’exemple donnĂ©, FluxCD va regarder dans le dossier clusters/my-cluster* pour s’autoconfigurer.

La documentation officielle concernant l'installation utilise un schéma comme celui-ci :

SchĂ©ma d’installation de FluxCD entre un cluster Kubernetes et un dĂ©pĂ´t Git

Astuce(s)

Trouver les détails sur le cluster

Dans le cluster Kubernetes, une fois FluxCD installé via le bootstrap, nous avons plusieurs ressources utiles pour cela :

Il y en a d’autres mais ce sont celles-ci qui nous intĂ©ressent.

Si vous avez suivi le tutoriel sur le site officiel, tout ceci est dans un namespace flux-system. Ainsi on peut avoir les détails sur les différentes ressources :

# Affiche les ressources habituelles (pod, service, deployment et replicaset) contenues dans le namespace flux-system
kubectl -n flux-system get all
# Affiche la liste des dépôts Git suivis
kubectl -n flux-system get gitrepositories
# Exemple : Affiche les détails du dépôt Git nommé flux-system
kubectl -n flux-system describe gitrepositories.source.toolkit.fluxcd.io flux-system
# Affiche la liste des kustomizations
kubectl -n flux-system get kustomizations
# Exemple : Affiche les détails de la kustomization nommée flux-system
kubectl -n flux-system describe kustomizations.kustomize.toolkit.fluxcd.io flux-system

Dans les deux derniers exemples, on va retrouver les infos principales :

# URL utilisée par FluxCD pour le dépôt Git
kubectl -n flux-system describe gitrepositories.source.toolkit.fluxcd.io flux-system |grep URL
# Chemin dans le dépôt Git utilisé par FluxCD
kubectl -n flux-system describe kustomizations.kustomize.toolkit.fluxcd.io flux-system |grep path -i

Dans mon exemple, j’aurais :

URL:      https://gitlab.com/odtre/gitops_zou.git

pour l’URL. Et :

Path:      ./clusters/zou

pour le chemin dans lequel FluxCD « écoute » les manifestes kubernetes.

Exemples

DĂ©ployer un Gitlab Runner

En bref

Dans un fichier gitlab-runner.yaml par exemple, situé dans le dossier ./clusters/zou précédent :

---
apiVersion: v1
kind: Namespace
metadata:
  name: testing
  labels:
    toolkit.fluxcd.io/tenant: dev-team
---
# DĂ©pĂ´t HELM de Gitlab
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: gitlab
  namespace: testing
spec:
  interval: 5m
  url: https://charts.gitlab.io
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: gitlab-runner
  namespace: testing
spec:
  releaseName: gitlab-runner
  chart:
    spec:
      chart: gitlab-runner
      sourceRef:
        kind: HelmRepository
        name: gitlab
        namespace: testing
      version: ">=0.73.3 <0.74.0" # Plage de versions pour éviter des désagréments
  interval: 50m
  values:
    gitlabUrl: https://gitlab.com
    rbac:
      create: true
    serviceAccount:
      create: true
    metrics:
      enabled: false
      serviceMonitor:
        enabled: false
    runnerToken: "glrt-tuvwabcdefghijklmnopqrs"
runners:
      name: "zou-runner"

Explications

Le premier paragraphe dĂ©crit le namespace dans lequel on souhaite travailler, testing. Mais aussi un “label” pour dĂ©finir des Ă©quipes. Ce n’est pas obligatoire, mais nous avons utilisĂ© la valeur dev-team.

---
apiVersion: v1
kind: Namespace
metadata:
  name: testing
  labels:
    toolkit.fluxcd.io/tenant: dev-team

Le second paragraphe va dĂ©crire le dĂ©pĂ´t de Charts Ă  utiliser, en l’occurence https://charts.gitlab.io.

On utilise le mĂŞme namespace qu’avant, testing. Et on donne un nom, gitlab au HelmRepository.

---
# DĂ©pĂ´t HELM de Gitlab
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: gitlab
  namespace: testing
spec:
  interval: 5m
  url: https://charts.gitlab.io

Ce qui va donner le dernier paragraphe pour indiquer quelle(s) version(s) installer pour le chart visé.

On renseigne :

En effet, values va reprendre le contenu du fichier values.yaml dans le Chart Helm officiel de Gitlab . Par exemple ici on reprend :

On lui a aussi donné un petit nom : zou-runner (tout en bas).

---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: gitlab-runner
  namespace: testing
spec:
  releaseName: gitlab-runner
  chart:
    spec:
      chart: gitlab-runner
      sourceRef:
        kind: HelmRepository
        name: gitlab
        namespace: testing
      version: ">=0.73.3 <0.74.0" # Plage de versions pour éviter des désagréments
  interval: 50m
  values:
    gitlabUrl: https://gitlab.com
    rbac:
      create: true
    serviceAccount:
      create: true
    metrics:
      enabled: false
      serviceMonitor:
        enabled: false
    runnerToken: "glrt-tuvwabcdefghijklmnopqrs"
runners:
      name: "zou-runner"

Liens utiles