Ce qu’on fait

Installation d’ArgoCD pour le déploiement continu sur Kubernetes via Terraform et Helm.


Pré-requis

  • Cluster GKE up and running
  • Connaissance de base de Kubernetes et GitOps
  • Outils : terraform, gcloud, kubectl, helm

Étapes

1. Installation d’ArgoCD

Pour cette partie j’ai choisi d’installer ArgoCD via Terraform en utilisant le provider Helm. Cela nous permettra de gérer l’installation d’ArgoCD de manière déclarative et reproductible. Argo sera ensuite en charge de déployer les workloads sur notre cluster Kubernetes.

Ajout des providers nécessaires dans notre configuration Terraform :

provider "kubernetes" {
  host                   = "https://${google_container_cluster.primary.endpoint}"
  token                  = data.google_client_config.default.access_token
  cluster_ca_certificate = base64decode(google_container_cluster.primary.master_auth.0.cluster_ca_certificate)
}

provider "helm" {
  kubernetes = {
    host                   = "https://${google_container_cluster.primary.endpoint}"
    token                  = data.google_client_config.default.access_token
    cluster_ca_certificate = base64decode(google_container_cluster.primary.master_auth.0.cluster_ca_certificate)
  }
}

Ne pas oublier terraform init pour installer les providers. Ensuite, nous allons ajouter une ressource Helm pour installer ArgoCD :

resource "helm_release" "argocd" {
  name             = "argocd"
  repository       = "https://argoproj.github.io/argo-helm"
  chart            = "argo-cd"
  version          = "9.5.15"
  namespace        = "argocd"
  create_namespace = true

  set = [
    {
      name  = "dex.enabled"
      value = "false"
    },
    {
      name  = "notifications.enabled"
      value = "false"
    },
    {
      name  = "applicationSet.enabled"
      value = "false"
    },
    {
      name  = "server.extraArgs[0]"
      value = "--insecure"
    }
  ]

  depends_on = [google_container_node_pool.primary_nodes]
}

Ici nous installons ArgoCD dans le namespace argocd en désactivant certaines fonctionnalités que nous n’utiliserons pas pour le moment (Dex, notifications, ApplicationSet) et en configurant le serveur ArgoCD pour qu’il fonctionne en mode non sécurisé (insecure) pour simplifier les choses dans un environnement de développement.


2. Création de la Root Application ArgoCD (App of Apps Pattern)

Le pattern “App of Apps” est une approche recommandée pour organiser les applications dans ArgoCD. Il consiste à créer une application principale (root application) qui référence d’autres applications (child applications).

Cela permet de structurer les déploiements de manière hiérarchique et de faciliter la gestion des dépendances entre les applications.

resource "kubernetes_manifest" "argocd_app" {
  manifest = {
    apiVersion = "argoproj.io/v1alpha1"
    kind       = "Application"
    metadata = {
      name      = "root-app"
      namespace = "argocd"
    }
    spec = {
      project = "default"
      source = {
        repoURL        = "https://github.com/Bernedotcom2312/theforge-cd.git" #Changez pour le votre
        targetRevision = "main"
        path           = "apps"
      }
      destination = {
        server    = "https://kubernetes.default.svc"
        namespace = "default"
      }
      syncPolicy = {
        automated = {
          prune    = true
          selfHeal = true
        }
      }
    }
  }

  depends_on = [helm_release.argocd]
}

Cette configuration crée une application ArgoCD nommée root-app qui pointe vers un dépôt Git contenant les définitions des applications à déployer. Le champ syncPolicy est configuré pour permettre le déploiement automatique et de réparer les ressources qui ne sont pas conformes à la configuration (selfHeal).

3. Application de la configuration Terraform

Maintenant que nous avons ajouté la configuration pour installer ArgoCD et créer la root application, nous pouvons appliquer notre configuration Terraform :

terraform apply

Cette commande va provisionner ArgoCD sur notre cluster GKE et créer la root application qui référencera les applications à déployer depuis notre dépôt Git.


Résultat

ArgoCD est maintenant installé sur notre cluster GKE et prêt à être utilisé pour le déploiement continu de nos applications.

Vous pouvez vérifier que les pods ArgoCD sont en cours d’exécution avec la commande suivante :

kubectl get pods -n argocd
NAME                                                READY   STATUS    RESTARTS      AGE
argocd-application-controller-0                     1/1     Running   0             94s
argocd-applicationset-controller-6c6b88d4bc-krjc5   1/1     Running   0             95s
argocd-dex-server-79fc985b7b-rbz6w                  1/1     Running   2 (77s ago)   96s
argocd-notifications-controller-6c44f9dbbf-v4777    1/1     Running   0             96s
argocd-redis-7979d55d5b-ft6rc                       1/1     Running   0             96s
argocd-repo-server-584c965f87-tzvsg                 1/1     Running   0             95s
argocd-server-5f7d4885d5-vkccj                      1/1     Running   0             95s

Accès au dashboard ArgoCD :

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

Rendez vous sur http://localhost:8080. Vous devriez avoir un warning de sécurité concernant le mode “insecure” que nous avons configuré pour le serveur ArgoCD, mais c’est acceptable pour un environnement de développement, nous verrons comment sécuriser cela dans une prochaine étape.

Pour se connecter, utilisez les identifiants suivants :

  • Username : admin
  • Password : le mot de passe est généré automatiquement et stocké dans le secrets argocd-initial-admin-secret dans le namespace argocd. Vous pouvez le récupérer avec la commande suivante :
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

Notre application d’exemple (Nginx) devrait également être déployée et visible dans l’interface d’ArgoCD.

kubectl get pods -n demo
NAME                    READY   STATUS    RESTARTS   AGE
nginx-78b9f9966-bh7vb   1/1     Running   0          110s

Un dernier port-forward pour accéder à l’application Nginx :

kubectl port-forward svc/nginx -n demo 8081:80

Et voilà le résultat en accèdant au port 8081 de votre localhost :

Welcome page nginx

Ce qui vient ensuite

La prochaine brique de notre plateforme Kubernetes : le monitoring.


Sources