
Comment j'ai réduit de plus de 50% le coût de mon cluster Kubernetes (tout en gagnant en puissance)
Oursi.net tourne sur Kubernetes, et quand je l'ai déployé pour la première fois, j'ai utilisé l'offre Kubernetes managée de DigitalOcean. Mon setup était très minimal : une VM avec 2 vCPU et 4Go de RAM (24$), plus un load balancer (12$). Même avec cette config de base, ma facture atteignait environ 50$/mois (TVA incluse) — assez cher vu le faible trafic du site.
Alors j'ai cherché une alternative.
Explorer des options moins chères
J’ai pensé à faire tourner Kubernetes à la maison, sur un petit PC. Mais je suis en France, et chez Orange (mon FAI), une IP fixe coûte presque 20$/mois. Beaucoup trop. Et je ne voulais pas m'embêter avec les changements d'IP dynamiques qui casseraient mes entrées DNS.
À la place, j’ai trouvé Contabo, un hébergeur VPS qui propose un serveur avec 8 vCPU et 24Go de RAM pour seulement 15$/mois — plus de trois fois les ressources que j’avais chez DigitalOcean, pour deux fois moins cher. J’ai aussi pris l’option réseau privé (quelques euros de plus) pour permettre à mes futurs workers de communiquer entre eux facilement.
D'autres fournisseurs ont des prix similaires, choisissez en fonction de ce qui vous convient, je n'ai pas d'affiliation avec Contabo ^^
Pourquoi k3s ?
J’ai choisi k3s parce que :
- Il est léger
- Il est facile à installer
- Il a un provisioner local intégré
- Il fonctionne très bien avec une approche GitOps (coucou ArgoCD)
Déployer le nœud maître (control plane)
Une fois mon VPS (Ubuntu 24.04) en place, j’ai fait les étapes suivantes :
Préparer le nœud :
1cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf 2overlay 3br_netfilter 4EOF 5 6modprobe overlay 7modprobe br_netfilter 8 9cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf 10net.bridge.bridge-nf-call-iptables = 1 11net.bridge.bridge-nf-call-ip6tables = 1 12net.ipv4.ip_forward = 1 13net.ipv6.conf.all.forwarding = 1 14EOF 15 16sysctl --system 17swapoff -a 18mkdir /local-path-provisioner 19hostnamectl set-hostname k3s-master
Ceci permet d’activer les bons modules réseau, désactiver le swap (obligatoire pour Kubernetes) et créer un dossier pour le stockage local.
Installer k3s :
1export K3S_VERSION=v1.33.1+k3s1 2curl -sfL https://get.k3s.io | \ 3 INSTALL_K3S_VERSION=$K3S_VERSION sh -s - server \ 4--cluster-init \ 5--default-local-storage-path /local-path-provisioner \ 6--tls-san 194.163.138.155 \ 7--tls-san k3s.oursi.net \ 8--tls-san k3s-master.oursi.net \ 9--node-ip 10.0.0.1 \ 10--node-external-ip 194.163.138.155 \ 11--flannel-iface eth1 \ 12--disable traefik,metrics-server
Remplacez les IPs et SANs par les vôtres.
10.0.0.1
est l'IP sur le réseau privé,194.163.138.155
est l’IP publique.
J’ai ajouté des enregistrements DNS pourk3s.oursi.net
etk3s-master.oursi.net
pointant vers l’IP publique.
⚠️ Tous les scripts doivent être lancés en tant que root (sudo -i
).
Accéder à Kubernetes depuis l’extérieur
Récupérez le fichier kubeconfig :
1scp root@k3s-master:/etc/rancher/k3s/k3s.yaml ~/.kube/config
Modifiez la ligne server:
:
1server: https://<votre-IP-ou-domaine-public>:6443
Vive le GitOps
J’ai désactivé l’installation automatique de Traefik et metrics-server, car je gère toute mon infra avec ArgoCD. Grâce à cette approche GitOps, la migration depuis DigitalOcean a été super simple :
- Re-déploiement d’ArgoCD
- Synchronisation des apps depuis Git
- Et voilà ✅
Conclusion
Aujourd’hui, je paye moins de 20$/mois, contre 50 avant. Et j’ai :
- Plus de CPU et de RAM
- Un réseau privé pour l’extension du cluster
- Un contrôle total sur mon infra
- Une facture bien plus légère 💸
Si vous gérez un projet perso ou un petit site sur Kubernetes, ce genre de migration vaut carrément le coup.
Je regarderai plus tard comment mettre en place un storage provider plus fiable que le local path provisioner. Pour l’instant, ce n’est pas une priorité car ma base PostgreSQL (déployée avec le Zalando operator, cf. autre article) effectue des sauvegardes vers S3, et c’est la seule donnée vraiment critique que j’ai besoin de préserver.