ArgoCD

2022-08-17 8 Min. lecture Kubernetes

Dans la mouvance GitOps, deux projets libres attirent l’attention, ArgoCD et FluxCD. Je vais dans cet article vous présenter rapidement ArgoCD. Je connais moins FluxCD pour l’instant, mais si vous êtes impatient de le connaître, je vous conseille de regarder l’excellente présentation de Laurent Grangeau et Ludovic Piot lors du BreizhCamp 2022. En ce qui me concerne je n’ai pas encore fait mon choix au moment d’écrire ces lignes. Les 2 outils ont leurs avantages et inconvénients.

Je ne vais pas ici, traduire la documentation en français, cela n’a pas beaucoup d’intérêt. Nous allons plutôt voir comment mettre en place rapidement ArgoCD et déployer les différentes applications de l’article sur Vault.

1. ArgoCD et GitOps

ArgoCD est l’outil le plus mature dans la liste des applications Argo. Chaque outil Argo est totalement indépendant et peut être utilisé seul.

Le but d’ArgoCD est de fournir une solution permettant de réconcilier l’état d’un cluster kubernetes avec un ou plusieurs dépôts Git de références. Toute modification dans le dépôt entraine une synchronisation de l’état des objets kubernetes de façon automatique ou après validation manuelle. C’est ce qu’on appelle un outil GitOps.

L’idée de GitOps est de ne plus effectuer directement d’opération sur le cluster kubernetes via la commande kubectl mais uniquement au travers de Git. Les avantages sont multiples, meilleur traçabilité, possibilité de revenir en arrière, d’avoir une configuration identique sur plusieurs clusters kubernetes, pas besoin d’accès direct à l’API kubernetes, etc …​

Certains diront qu’ArgoCD n’est pas un outil GitOps. Ce n’est pas complètement faux, car il permet de déroger à certaines règles si on le souhaite. Il est par exemple possible de déployer un Chart Helm en définissant les values directement dans l’interface web. Il est donc tout à fait possible de déployer des applications sans créer de dépôt Git.

Cela est à la fois un avantage et un inconvénient, ça offre une souplesse que nous n’avons pas avec d’autres outils tel que FluxCD, mais du coup nous perdons en traçabilité.

2. Mise en œuvre

Pour déployer ArgoCD, nous avons besoin d’un cluster kubernetes, de kubectl et de helm. Pour gérer nos applications,y compris ArgoCD, nous avons besoin d’au moins un dépôt Git. Pour le cluster kubernetes je partirai d’une installation propre d’un nouveau cluster avec rancher-desktop.

La gestion d’ArgoCD dans ArgoCD, fonctionne plutôt bien, ça évite de continuer à gérer cette unique applications à la main, alors que toute les autres sont gérées avec ArgoCD. Ce mécanisme est appelé "app-of-apps", il consiste a déclarer une méta-application qui contient ArgoCD. Le processus complet est décrit sur le site www.arthurkoziel.com.

Pour vous faire gagner du temps, j’ai déjà créer le projet argocd-infra sur framagit.org que nous allons cloner.

# Clone du projet
git clone https://framagit.org/gauthier/argocd-infra.git
cd argocd-infra
# Création du namespace pour ArgoCD
kubectl create ns argocd
# On se place dans le namespace argocd
kubens argocd
# On déploie ArgoCD avec le Helm Chart du dépôt
helm install argo-cd -n argocd charts/argo-cd/

Le déploiement d’ArgoCD prend moins de 60 secondes si vous avez une connexion rapide.

Nous pouvons maintenant déployer l'"app-of-apps", ce qui va créer dans ArgoCD une nouvelle application root qui contiendra ArgoCD, vault, vault-csi et secrets-store-csi-driver avec tout les bons paramétrage, tel que je les avais définit dans l’article sur vault.

# Déploiement de l'app-of-apps.
helm template apps/ | kubectl apply -f -
# Suppression info Helm du déploiement d'ArgoCD
kubectl delete secret -l owner=helm,name=argo-cd

2.1. Connexion à l’interface web

Par défaut un mot de passe aléatoire est généré automatiquement à l’installation d’ArgoCD. Il est stocké dans un secret que nous pouvons supprimer ensuite.

Pour afficher ce mot de passe il faut lancer la commande suivante :

kubectl get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

2.1.1. Utiliser la commande argocd-server

Dans un cas simple d’expérimentation d’ArgoCD comme le notre il existe 2 moyens simples pour se connecter à l’interface web :

La commande argocd-server fait parti du paquet argocd-cli que vous pouvez installer en suivant cette procédure. Si vous souhaitez vous connecter à ArgoCD en cli, il faudra de toute façon effectuer cette opération.

Moi sur Arch je dois juste lancer la commande :

pacman -S argocd

Ensuite, placez vous dans le namespace argocd et lancez la commande argo-server. Vous pouvez maintenant vous connecter sur https://localhost:8080

2.1.2. Mettre en place un port-forward

Solution la plus rapide :

kubectl port-forward svc/argo-cd-argocd-server 8080:443 -n argocd

2.1.3. Visualisation

Une fois identifié, vous devez avoir ceci :

ArgoCD

Si Vault n’est pas opérationnel, c’est que vous ne l’avez pas initialisé ou descellé.

2.2. ArgoCD en ligne de commande

2.2.1. Connexion

Le paquet argocd que nous avons téléchargé pour fournir le programme argocd-server fournit également le programme argocd.

Nous allons donc l’utiliser pour administrer l’outil.

kubens argocd
argocd login localhost:8080 --insecure --username admin --password $(kubectl get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d)

Nous utilisons ici directement le mot de passe stocké dans le secret kubernetes. S’il est effacé il faudra saisir celui-ci.

2.2.2. Création d’une application en ligne de commande

  • Avant d’installer l’application, nous allons dans un premier temps créer un nouveau projet que nous appellerons dev.
  • Dans lequel nous autorisons le déploiement d’applications uniquement sur le serveur local et dans le namespace apps.
  • Et uniquement depuis mon compte GitLab sur framagit.
argocd proj create dev
argocd proj add-destination dev https://kubernetes.default.svc apps
argocd proj add-source dev "https://framagit.org/gauthier/*"

Nous pouvons maintenant créer notre application :

argocd app create webapp \
      --project dev \
      --repo https://framagit.org/gauthier/argocd-test1.git \
      --path webapp-vault \
      --dest-server https://kubernetes.default.svc \
      --dest-namespace=apps \
      --sync-policy auto

L’application apparait dans l’interface web et vous pouvez observer le détail du déploiement :

webapp

Et si je souhaite supprimer cette application :

argocd app delete webapp

Tout simplement.

3. Pour aller plus loin

Le but de cet article, n’est pas de couvrir l’ensemble des fonctionnalités d’ArgoCD. Je vais néanmoins lister ici quelques points que je trouve intéressant et d’autres nécessitant réflexion.

3.1. Fonctionnalités intéressantes

3.1.1. Gestion multi-cluster

Nous l’avons vu rapidement lors de la création d’un projet, il est possible de gérer plusieurs cluster kubernetes depuis une seule application ArgoCD. Il faut dans ce cas, juste déployer les CRD pour qu’ArgoCD puisse gérer les applications.

Du coup, nous avons une interface web qui permet d’avoir une vue d’ensemble des applications déployées sur plusieurs clusters. Nous pouvons filtrer l’affichage par namespace, par nom, par cluster ou par métadonnées.

3.1.2. Gestion multi-utilisateurs en cli et web

Dans le tuto nous nous sommes connecté en admin, mais il est possible de créer de nombreux utilisateurs, voir lié ArgoCD à un ldap. Ensuite il est possible d’attribuer des rôles à chaque utilisateur ou groupe d’utilisateurs pour leur restreindre leurs droits sur un cluster, un projet, un dépôt git, un namespace, une application, une action (get, create, update, sync, delete, override), l’accès au log, …​

Actuellement la gestion des droits et des utilisateurs ne peut être fait via l’interface web, il faut alimenter un configmap pour définir ces droits et utilisateurs.

3.1.3. Gestion des mots de passe

Nous pourrions écrire un article complet sur cette problématique et sur la bonne façon de faire. ArgoCD nous laisse le choix des outils de gestion de mots de passe.

3.1.4. Déploiement conditionné à la signature du commit

Il est possible pour chaque projet de spécifier une liste de clés gpg. Ces clés seront utilisées par ArgoCD pour vérifier la validité d’un commit. Si la clé n’est pas dans la liste, le déploiement ne sera pas mis à jour.

3.2. Points de vigilance

3.2.1. Du GitOps mais pas de façon strict

Comme indiqué en introduction, ArgoCD permet d’interagir avec kubernetes sans obligation de passer par un commit dans un dépôt Git. Cela permet une souplesse que ne permet pas FluxCD, mais en contre partie nous perdons en traçabilité. Or la traçabilité permet souvent de trouver plus facilement la raison d’un dysfonctionnement.

3.2.2. Sécurité

ArgoCD a énormément de droits sur le ou les clusters kubernetes, notamment sur les clusters de prod. Ce qui est tout à fait normal, vu les tâches qui lui sont confiées. Personnellement je ne mettrais pas ArgoCD accessible d’internet et pourtant cet outil est régulièrement audité.

3.2.3. Gestion des déploiements

ArgoCD permet de déployer du Helm, Kustomize, Jsonnet ou tout simplement des fichiers Yaml présent dans le répertoire d’un dépôt Git.

Vous avez certainement remarqué, qu’après la mise en place de l’app-of-apps qui m’a permit de gérer ArgoCD dans ArgoCD, j’ai supprimé le secret contenant les informations de déploiement du Chart Helm.

En effet ArgoCD permet de déployer des Charts Helm, mais ces derniers ne sont plus gérer par Helm, et donc la commande helm list ne retournera rien. Il est donc très facile de migrer ses applications préalablement installées avec Helm sous ArgoCD, mais le contraire est moins évident.

4. Conclusion

La mise en place d’un outil GitOps nécessite de repenser sa façon de déployer et de mettre à jour ses applications. Un outil comme ArgoCD permet grâce aux "app-of-apps" de provisionner rapidement tout un ensemble d’applications lors de la mise en place d’un nouveau cluster. On pourra d’ailleurs noter à ce sujet que le projet Devops-Stack, s’appuie sur ArgoCD pour provisionner et configurer rapidement tout les briques techniques dont ils ont besoin.

ArgoCD est un bon outil, utilisé par une large communauté. Nous avons à notre disposition une belle interface bien conçue. Les autres outils Argo, parfois pas très mature, permettent de couvrir un ensemble beaucoup plus large de fonctionnalités, mais dont vous n’avez peut-être pas besoin. Il est donc pertinent d’en faire des applications séparées.