Argo CD, quelle valeur ajoutée ?

On a souvent l'habitude de faire un déploiement sur Kubernetes depuis nos postes, mais cela pose un problème majeur : "Qui a déployé quoi et dans quelle version ?"

Le gestionnaire de configuration Helm répond à la deuxième partie de la question en permettant de créer des versions d'un ensemble de fichier de configuration.

Néanmoins, Helm ne permet pas de voir un seul coup la totalité des objets créés sur notre clusters, il faut donc aller sur chaque objet (déploiement, pods, service, ingress, etc.) pour voir leurs états.

Argo CD apporte avec lui cet aspect graphique agissant comme une tour de contrôle sur l'ensemble de nos créations d'objets Kubernetes. De plus, on est en mesure de contrôler et donner des accès à un ou plusieurs utilisateurs afin de permettre de déployer des applications sur ce type d'orchestrateur.

Cet outil prend en charge plusieurs formats : Kustomize, Helm (celui que nous verrons par la suite), Ksonnet, Jsonnet ainsi que de simples fichiers YAML ou JSON.

Présentation de l'outil

Argo CD est un outil open-source qui se déploie sur cluster Kubernetes qui permet de contrôler le déploiement d'une application ainsi que son cycle de vie.

D'autres fonctionnalités sont aussi présentes :

  • Intégration SSO ;
  • Permet de déployer sur plusieurs clusters Kubernetes à la fois ;
  • Expose des métriques Prometheus ;
  • Possibilité de surcharger les valeurs par défaut d'un Chart Helm ;
  • etc.

N'hésitez pas à consulter la documentation officielle pour la liste complète.

Voici l'architecture officielle :

argocd-architecture

On peut donc voir qu'il y a trois parties majeures :

  • L'API de type gRPC/REST pour l'ensemble des appels vers le service ;
  • La Repository Service qui va stocker les données Git et qui va puller le code dans un cache local ;
  • L'Application Controller qui est un controller Kubernetes qui va superviser l'ensemble des applications déployées et qui va comparer de manière périodique la version de l'application qui vie sur le cluster avec les données issues du dépôt de code Git.

On peut aussi connecter différentes applications, par exemple Slack, qui va envoyer un message si la version d'une application versionnée n'est pas synchronisée avec le dépôt de code.

Installation

Nous allons maintenant aborder la partie installation qui va suivre de manière assez fidèle la documentation officielle.

Tout d'abord, il est bien évidemment impératif d'avoir accès un cluster Kubernetes pour réaliser l'ensemble de ces opérations et de disposer de droits suffissants pour y installer Argo CD.

Argo CD propose une méthode d'installation à base de la commande kubectl, néanmoins un Chart Helm existe aussi, que vous pouvez retrouver sur ce lien.

Vous pouvez choisir l'une ou l'autre de ces méthodes qui seront décrites par la suite.

Méthode kubectl

Dans cette première méthode, il faut créer un namespace argocd dans lequel l'ensemble des composants qui participent au bon fonctionnement d'Argo CD seront déployés.

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Méthode Chart Helm

Tout d'abord, il faut cloner le dépot de code Git qui contient le Chart Helm officiel d'Argo CD :

git clone https://github.com/argoproj/argo-helm

Ensuite se déplacer le dossier qui contient les templates à déployer.

cd charts/argo-cd/

Une fois positionné dans ce dossier, il est possible d'éditer le fichier values.yaml pour y mettre une configuration personnalisée.

Enfin, une fois les modifications faites, il ne reste plus qu'à déployer les fichiers de configuration sur le cluster Kubernetes via cette commande :

helm install --name <nom de la version> .

Accès au service

Une fois l'installation terminée, il est maintenant possible d'accéder à l'instance déployée via un port-forward.

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

Une fois la commande exécutée, Argo CD est accessible à cette url :

http://localhost:8080

Dans le cas où l'on souhaite faire sortir Argo CD sur internet, via un Ingress, il est nécessaire de changer le type du service par défaut et de le passer en LoadBalancer.

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'

Il vous reste à créer votre propre Ingress afin d'exposer le service de votre cluster Kubernetes vers l'extérieur.

Voici un exemple que j'utilise personnellement (à adapter en fonction des besoins) :

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: argocd-server
  annotations:
    kubernetes.io/ingress.global-static-ip-name: <Votre nom d'ip statique>
    networking.gke.io/managed-certificates: "argocd-server"
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/name: argocd-server
    app.kubernetes.io/part-of: argocd
spec:
  rules:
  - host: <Votre nom de domaine>
    http:
      paths:
      - backend:
          serviceName: argocd-server
          servicePort: http

Dans mon cas, j'utilise les managed-certificates sur un cluster GKE, on peut bien sûr s'en passer et utiliser sa propre solution afin de sécuriser l'accès en HTTPS.

Déployer avec Argo CD

Passons au déploiement d'une application avec Argo CD.

Une fois l'outil déployé, vous arrivez sur une mire d'authentification comme celle-ci :

argocd-authentication-2

L'utilisateur par défaut est admin avec un mot de passe généré qui est le nom du pod qui tourne sur le cluster. Pour le récupérer, il suffit d'exécuter cette commande :

kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2

Une fois connecté, la page d'accueil s'ouvre. Plusieurs aspects sont à prendre en compte sur Argo CD :

Préparer son application

Afin de déployer une application, vous devez au préalable initialiser le dépôt de code Git qui contiendra l'ensemble des fichiers YAML ou templates de chart Helm à déployer. De plus, Argo CD peut directement pointer vers un dépôt Helm.

argocd-repository

C'est à travers ce volet qu'il est possible de réaliser cette action, celui-ci est accessible via Manage you repositories, projects, settings > Repositories > Connect repo using SSH / HTTPS.

Déployer son application

Une fois le dépôt de code configuré, on peut créer une application en suivant le menu Manage your applications, and diagnose health problems > New app.

Un volet s'ouvre avec plusieurs catégories :

  • General : Ici on va configurer les paramètres standards de l'application. La Sync policy permet à l'utilisateur de définir s'il veut que son application se synchronise automatiquement ou si c'est à lui d'appuyer sur un bouton pour qu'elle se mette à jour sur le cluster cible ;
  • Source : On configure le dépôt de code préalablement initialisé avec la Revision qui permet de sélectionner une branche, un tag ou un commit spécifique ;
  • Destination : C'est à travers cette section que l'on vient spécifier le cluster sur lequel on va déployer l'application. Par défaut, le cluster où est installé Argo CD est paramétré.

Dans le cas d'un chart Helm par exemple, une section supplémentaire s'affiche :

argocd-application-helm

Elle permet de sélectionner le fichier values.yaml que l'on souhaite utiliser (dans le cas de plusieurs fichiers par type d'environnement par exemple), et de surcharger les valeurs de celui-ci dans la partie VALUES.

Une fois le tout configuré, il reste à appuyer sur CREATE.

Votre application apparaît sous le forme d'une tuile de couleur orange si l'application n'est pas synchronisée ou verte si elle l'est.

On peut visualiser l'ensemble des objets Kubernetes si on clique sur la tuile de l'application que l'on souhaite déployer.

Voici un exemple d'application avec l'ensemble des objets Kubernetes créé :

argocd-application-deploy

Cela permet de voir les dépendances entre les objets, par exemple : Deployment > Replica Set > Pod mais aussi la santé des objets, leur révision, le temps depuis leur création.

En cliquant sur un objet, on peut voir l'ensemble des événements de celui-ci et sa configuration YAML.

Conclusion

Argo CD est le genre d'outil qui est presque indispensable lorsque l'on déploie une multitude d'applications en production.

De mon point de vue, la possibilité de visualiser l'ensemble des objets Kubernetes sur une seule page est la grande force de l'outil et permet de contrôler efficacement quelle version est déployée sur quel cluster.

Pour terminer, je vous recommande d'utiliser ArgoCDExport pour sauvegarder l'ensemble de vos configurations régulièrement dans un espace de stockage pour éviter des mauvaises surprises.