Dans cet article, nous allons voir comment créer un cluster K3s et installer ArgoCD dessus pour déployer nos applications plus facilement.
C'est quoi K3s ?
K3s est une distribution Kubernetes légère. C'est une version de Kubernetes certifiée par la Cloud Native Computing Foundation (CNCF) avec des fonctionnalités ajoutées pour l'edge computing et l'IoT, mais elle est aussi parfaite pour les petits VPS.
Pourquoi ne pas utiliser K8s ? Parce que K8s est trop lourd pour un VPS standard. Par exemple, avec un VPS de 8 Go de RAM et 4 vCPUs, K8s peut avoir du mal à écrire correctement les logs et finir par crash. Ce n'est pas optimisé pour les petits serveurs.
Le binaire K3s ne fait que 478 Mo, et on peut le réduire encore plus avec la compression UPX. Il utilise SQLite comme base de données par défaut au lieu d'etcd. Vous pouvez changer la base de données, mais ce n'est pas recommandé pour des configurations simples. Alors que K8s utilise etcd et nécessite souvent une base externe, je préfère SQLite car c'est juste un fichier, c'est léger et facile à sauvegarder. On n'a pas besoin d'une architecture à la Netflix pour juste 2 ou 3 applications...
Comment K3s fonctionne
K3s fonctionne comme une entreprise : vous avez plusieurs personnes pour plein de tâches, et si une personne est absente, le travail ne s'arrête pas. Vous avez :
- le Patron (control plane)
- le manager (serveur K3s)
- l'équipe (workers)
Vous avez plusieurs services pour votre application, principalement :
- Deployment : utilisé pour déployer votre application avec un ou plusieurs conteneurs (utilise des images basées sur Docker ou Podman).
- StatefulSet : utilisé pour déployer votre application quand elle a besoin de sauvegarder son état ou son ID, typiquement pour les bases de données (Mongo, Postgres, MariaDB...).
- DaemonSet : utilisé pour déployer votre application sur tous les nœuds (workers) du cluster. Pratique pour les agents de monitoring ou de logs.
- PersistentVolume : comme un grand sac où vous pouvez créer un stockage pour vos données.
- PersistentVolumeClaim : c'est comme demander un sac ; vous définissez la taille et les propriétés que vous voulez, et le système vous en donne un.
- Service : comme une porte dans votre cluster ; vous pouvez exposer votre application à l'intérieur du cluster ou vers l'extérieur (ClusterIP, NodePort, LoadBalancer...).
- Ingress : comme votre porte d'entrée principale ; vous pouvez exposer votre application à l'extérieur avec un nom de domaine et un chemin. La porte d'entrée redirige la requête vers le service.
- Ingress Controller : un service qui gère les ingress (comme Nginx, Traefik, HAProxy...).
- Namespace : comme une boîte dans votre chambre ; vous pouvez mettre vos applications dans différentes boîtes pour ne pas les mélanger. C'est comme un dossier pour vos applications. Vous pouvez définir des règles de sécurité pour chaque boîte.
Vous pouvez créer tous ces "services" avec un fichier appelé "manifest". Le manifest est juste un fichier YAML qui décrit l'état souhaité de votre application.
Vous pouvez lancer ces services avec la commande kubectl apply -f
Installation de K3s
Maintenant que vous avez compris ce qu'est K3s, nous pouvons l'installer sur notre VPS et créer un cluster avec un seul nœud. Je recommande d'utiliser Ubuntu 22.04 ou Debian 12/13 pour le VPS.
Pour installer votre premier cluster, vous pouvez utiliser la commande :
curl -sfL https://get.k3s.io | sh -
Cette commande installe, crée et configure tout ce dont vous avez besoin pour votre cluster. Elle installe le control plane, le manager et l'équipe. Vous pouvez ajouter plus de nœuds pour ajouter des ressources, ou plus de managers pour avoir de la haute disponibilité.
Pour être sûr que tout est prêt, vous pouvez lancer cette commande après avoir attendu environ 30 secondes (pour être sûr que tout est opérationnel) :
sudo k3s kubectl get node
Si tout est prêt, vous verrez quelque chose comme ça :
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane,master 30s v1.27.3-k3s2
Félicitations, vous avez installé votre premier cluster avec K3s !
Pour votre culture, K3s est livré avec un contrôleur d'ingress appelé Traefik.
Traefik est un routeur Cloud Native utilisé dans beaucoup de projets. Dans notre cas, nous utilisons Traefik car il est robuste, léger et bien intégré avec K3s.
Si vous voulez utiliser un autre contrôleur d'ingress, vous pouvez l'installer avec une commande (Nginx par exemple) :
sudo k3s kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.0/deploy/static/provider/cloud/deploy.yaml
Vous pouvez vérifier si le contrôleur est bien installé avec :
sudo k3s kubectl get pod -n ingress-nginx
Pour Kubernetes, il existe d'autres contrôleurs d'Ingress :
- Kong
- HAProxy
- Istio
Et bien d'autres.
ArgoCD
C'est quoi ArgoCD ?
ArgoCD est un outil de Continuous Delivery (CD) déclaratif et GitOps pour Kubernetes. C'est un projet de la CNCF utilisé pour déployer et gérer des applications sur des clusters Kubernetes. Il compare l'état souhaité (dans Git) avec l'état actuel dans le cluster et synchronise les deux.
Comment ça marche ?
C'est très simple : vous avez votre dépôt sur Git et ArgoCD va récupérer la dernière version et la déployer dans votre cluster. Vous définissez l'état souhaité dans votre dépôt et ArgoCD s'occupe du reste.
Il y a une partie Web UI pour voir l'état de votre cluster, et une partie CLI (interface en ligne de commande) pour gérer le tout depuis votre terminal.
Avec ces deux outils, vous pouvez gérer votre cluster, créer des projets et faire des rollbacks si besoin.
Installation d'ArgoCD
Pour le HTTPS, vous avez besoin d'un nom de domaine
Si vous voulez utiliser ArgoCD avec HTTPS, vous avez besoin d'un nom de domaine pointant vers l'IP de votre VPS. Vous pouvez l'utiliser en HTTP, mais ce n'est pas recommandé pour la production.
Cluster Issuer
Pour utiliser le HTTPS avec ArgoCD, vous avez besoin d'un ClusterIssuer pour générer des certificats SSL.
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.3/cert-manager.yaml
# Attendez que les 3 pods soient en cours d'exécution
kubectl get pods -n cert-manager
Créer l'issuer et l'appliquer
Créez un fichier nommé cluster-issuer.yaml et appliquez-le. Dans notre cas, nous utilisons Let's Encrypt et Traefik comme contrôleur d'ingress.
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: votre-email@email.fr
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: traefik
Appliquez le fichier :
kubectl apply -f cluster-issuer.yaml
Vérifier si l'issuer est prêt
kubectl get clusterissuer
Si l'issuer est prêt, vous verrez :
NAME READY AGE
letsencrypt-prod True 2m
Installer ArgoCD
kubectl create namespace argocd
kubectl apply --server-side -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Optimization_Tip
On utilise --server-side car le fichier manifest est trop volumineux et peut causer des erreurs lors d'un apply classique.
Patcher ArgoCD pour le mode non-sécurisé
Par défaut, ArgoCD utilise le HTTPS avec son propre certificat auto-signé. Nous voulons le patcher pour autoriser les communications HTTP non-sécurisées en interne afin que notre Ingress (avec notre vrai certificat) puisse lui parler facilement sur le port 80.
kubectl patch configmap argocd-cmd-params-cm -n argocd --type merge -p '{"data": {"server.insecure": "true"}}'
kubectl rollout restart deployment argocd-server -n argocd
Exposer ArgoCD avec Traefik
Créez un fichier nommé argocd-server-ingress.yaml :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-server-ingress
namespace: argocd
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
traefik.ingress.kubernetes.io/router.entrypoints: websecure
traefik.ingress.kubernetes.io/router.tls: "true"
spec:
rules:
- host: argocd.votredomaine.fr
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 80
tls:
- hosts:
- argocd.votredomaine.fr
secretName: argocd-server-tls
Appliquez-le :
kubectl apply -f argocd-server-ingress.yaml
Vérifier si l'ingress et les certificats sont prêts
kubectl get ingress -n argocd
Vous devriez voir votre hôte et l'adresse IP. Ensuite, vérifiez le certificat :
kubectl get certificate -n argocd
Si READY est à True, c'est tout bon !
Récupérer le mot de passe admin initial
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
Première connexion à ArgoCD
Allez sur https://argocd.votredomaine.fr (remplacez par votre domaine).

Identifiants :
Username: admin
Password: [LE_MOT_DE_PASSE_RECUPERE_PRECEDEMMENT]
Après la connexion, vous verrez votre tableau de bord vide :

Félicitations ! Vous avez installé avec succès ArgoCD sur votre cluster K3s. Vous pouvez maintenant commencer à déployer vos applications en mode GitOps !


