A propos Compétences Expérience Services Blog Contact

Je n'ai pas pris Kubernetes, et voici la facture exacte I did not pick Kubernetes, and here is the exact bill

On me demande souvent pourquoi ma plateforme perso ne tourne pas sur Kubernetes. Voici la réponse complète, chiffres à l'appui.

TL;DR : ma plateforme DevSecOps complète tourne sur Docker Swarm, au-dessus d'un maillage WireGuard, pour environ 30 euros par mois, facture réelle. La fiabilité n'est pas le problème. Le vrai prix, c'est la rigidité : ajouter ou retirer un nœud reste une opération manuelle. Et le VPN devient une dépendance dure de l'orchestrateur. Je signe quand même.

Cet article est pour les petites équipes, les indés et les plateformes internes. Ceux qui hésitent entre Kubernetes et plus simple.

Le contexte

Je fais tourner une plateforme DevSecOps auto-hébergée pour mes projets. Dessus : un reverse proxy Traefik, un PostgreSQL partagé, un Keycloak pour l'identité, et la supervision avec Prometheus, Grafana et Loki. Un SIEM Wazuh s'active en option. Un SIEM est l'outil qui centralise et analyse les événements de sécurité.

Terraform crée les machines. Ansible les configure. Docker Swarm orchestre les conteneurs.

Le tout vit sur une poignée de petites VM chez un hébergeur européen. Elles se parlent à travers un maillage VPN WireGuard (NetBird). Un maillage VPN, c'est simple : chaque machine parle aux autres dans un tunnel chiffré direct.

La facture, la vraie

Les prix catalogue sont trompeurs. Mes VM coûtent quelques euros pièce hors taxes. La facture qui tombe chaque mois, elle, dit 30 euros.

# La plateforme complète, par mois
1 manager cx32 (4 vCPU, 8 Go)
des workers cx22 (2 vCPU, 4 Go)
1 petite VM dédiée au VPN
1 VM cx32 pour le SIEM, en option

Facture réelle : ~30 € par mois, tout compris

L'écart entre le catalogue et la facture a des noms : la TVA, les adresses IPv4, les sauvegardes, les volumes.

En dev, je fusionne la supervision dans le manager et je coupe le SIEM. La même plateforme tient alors sur une ou deux petites VM.

Un Kubernetes managé ajoute le prix du plan de contrôle avant même les nœuds. Et un Kubernetes que tu gères toi-même te coûte en temps ce qu'il ne coûte pas en euros.

La facture Kubernetes cache aussi un gâchis documenté. D'après le rapport Cast AI 2026, sur plus de 23 000 clusters de production, l'utilisation CPU réelle est de 8 %. Et 69 % des clusters sont surprovisionnés en CPU.

Ce que Swarm donne sans effort

Swarm est intégré à Docker. Il n'y a pas de plan de contrôle à installer, ni de composant de plus à surveiller.

Mon playbook d'initialisation est court et rejouable. Il initialise le manager, fait joindre les workers un par un, pose les labels, crée les réseaux et les secrets.

Les réseaux overlay sont chiffrés. Les secrets sont gérés nativement. Le placement des services se règle avec des labels de nœuds.

Swarm est ennuyeux. Pour une infra, c'est un compliment.

Piège n°1 : docker stack deploy ignore ton .env

Premier piège, et il surprend tout le monde. docker compose up lit ton fichier .env et remplace les variables. docker stack deploy l'ignore complètement.

Le symptôme est vicieux. Tes règles Traefik contiennent un littéral app.${DOMAIN} au lieu de ton domaine. Rien ne crashe. Le routage ne marche juste pas.

C'est une limite connue et assumée depuis des années (issue moby n°29133).

Mon contournement : je ne donne jamais un compose brut à Swarm. Ansible génère chaque fichier depuis un template Jinja2, variables déjà remplacées. Les valeurs sensibles viennent du vault Ansible, pas d'un fichier d'environnement.

Piège n°2 : le MTU de la double encapsulation

Le deuxième piège est réseau. Mes conteneurs se parlent en VXLAN, le réseau overlay de Swarm. Et ce VXLAN passe dans WireGuard. Deux encapsulations, donc deux en-têtes à caser dans chaque paquet.

Le MTU est la taille maximale d'un paquet sur un lien. Chaque encapsulation en consomme un morceau.

WireGuard refuse de fragmenter les paquets trop gros. C'est un choix de design assumé. Un paquet trop gros est rejeté, pas découpé.

La règle tient en une ligne :

# VXLAN ajoute ~50 octets d'en-têtes
mtu_docker = mtu_vpn - 50

# chez moi : 1280 - 50 = 1230
# /etc/docker/daemon.json
{ "mtu": 1230 }

Et le test est reproductible avec un simple ping :

# 1202 octets + 28 d'en-tête ICMP = 1230 : passe
ping -M do -s 1202 100.64.0.2

# 1252 + 28 = 1280 : rejeté, paquet trop gros
ping -M do -s 1252 100.64.0.2

Si tu oublies ce réglage, le TCP survit à peu près, car il négocie la taille de ses segments. L'UDP, non. Chez moi, c'étaient les métriques qui partaient en timeout, sans une ligne d'erreur utile.

Le vrai prix : la rigidité

Mon audit interne du setup le résume en une phrase : « bien conçu mais architecturalement statique ». Je confirme.

Ajouter un nœud demande trois étapes. Une définition de VM dans Terraform. Une entrée dans le template d'inventaire. Un re-run du playbook d'initialisation.

Retirer un nœud est pire, car tout est manuel. Drainer les services, sortir le nœud du Swarm, détruire la VM. Dans cet ordre, sans se tromper. C'est mon plus gros point de douleur documenté.

Le risque qui va avec : un nœud tombe du Swarm et Terraform ne le sait pas. Personne ne le ramène. Il n'y a pas d'auto-réparation.

La dépendance que Kubernetes n'a pas : le VPN

Tout le plan de contrôle du Swarm passe par le maillage. Le manager annonce son adresse VPN. Les workers le joignent par cette adresse.

La conséquence est directe : si le VPN tombe, l'orchestrateur devient injoignable. Le VPN n'est plus un confort. C'est une fondation.

J'ai accepté cet échange en connaissance de cause. En retour, j'ai du chiffrement partout et une plateforme portable chez n'importe quel hébergeur.

Quand je prendrais Kubernetes quand même

Ce montage a un domaine de validité. Le mien : une plateforme stable, un seul opérateur, des nœuds qui ne bougent presque jamais.

Je prendrais Kubernetes le jour où les nœuds doivent bouger tout seuls. Autoscaling, remplacement automatique des machines, environnements éphémères.

Je le prendrais aussi avec plusieurs équipes qui déploient. Namespaces, RBAC, opérateurs : cette machinerie existe pour ça.

Gartner annonçait 80 % des grandes organisations d'ingénierie avec une équipe platform engineering en 2026. Si c'est toi, prends Kubernetes. Si vous êtes trois, ce chiffre ne parle pas de toi.

Ce n'est pas « Kubernetes est mort ». C'est « Kubernetes est un coût ». Achète-le quand il te rapporte.

La checklist avant de choisir

Passe cette liste avant de créer ton cluster, dans un sens comme dans l'autre.

  • Compte tes nœuds : en dessous de cinq, Swarm ou même docker compose suffit souvent
  • Chiffre les deux factures, celle de l'hébergeur et celle de ton temps
  • Overlay sur VPN : mtu_docker = mtu_vpn - 50, et vérifie au ping -M do
  • Ne compte jamais sur le .env avec docker stack deploy : génère tes compose
  • Écris les playbooks de drain et de retrait de nœud avant d'en avoir besoin
  • Liste ce qui dépend du VPN, et ce qui reste debout s'il tombe
  • Note dès aujourd'hui ce qui te ferait migrer vers Kubernetes

Ce qu'il faut retenir

Une plateforme complète tient sur Swarm pour une trentaine d'euros par mois. La fiabilité n'a pas été mon problème.

Le prix se paie ailleurs. Chaque changement de topologie est un chantier manuel. Et le VPN porte tout.

Fais le calcul pour ton cas, pas pour le CV. L'orchestrateur le plus simple qui couvre ton besoin est le bon.

Tu hésites entre Swarm, Kubernetes ou un entre-deux pour ta plateforme ? Parlons-en.

People keep asking why my personal platform does not run on Kubernetes. Here is the full answer, with numbers.

TL;DR: my complete DevSecOps platform runs on Docker Swarm, on top of a WireGuard mesh, for about 30 euros a month, real invoice. Reliability is not the problem. The real price is rigidity: adding or removing a node is still a manual job. And the VPN becomes a hard dependency of the orchestrator. I would sign again.

This article is for small teams, solo builders and internal platforms. Anyone torn between Kubernetes and something simpler.

The setup

I run a self-hosted DevSecOps platform for my projects. On it: a Traefik reverse proxy, a shared PostgreSQL, a Keycloak for identity, and monitoring with Prometheus, Grafana and Loki. A Wazuh SIEM can be switched on. A SIEM is the tool that collects and analyzes security events.

Terraform creates the machines. Ansible configures them. Docker Swarm orchestrates the containers.

Everything lives on a handful of small VMs at a European cloud provider. They talk to each other through a WireGuard mesh VPN (NetBird). A mesh VPN is simple: every machine talks to the others through a direct encrypted tunnel.

The real bill

Catalog prices are misleading. My VMs cost a few euros each before taxes. The invoice that lands every month says 30 euros.

# The full platform, per month
1 manager cx32 (4 vCPU, 8 GB)
worker VMs on cx22 (2 vCPU, 4 GB)
1 small dedicated VPN VM
1 cx32 VM for the SIEM, optional

Real invoice: ~30 EUR per month, everything included

The gap between catalog and invoice has names: VAT, IPv4 addresses, backups, volumes.

For dev, I merge monitoring into the manager and turn the SIEM off. The same platform then fits on one or two small VMs.

A managed Kubernetes adds the control plane fee before you even pay for nodes. And a self-managed Kubernetes charges you in time what it does not charge in euros.

The Kubernetes bill also hides documented waste. According to the Cast AI 2026 report, across 23,000+ production clusters, real CPU utilization sits at 8%. And 69% of clusters are overprovisioned on CPU.

What Swarm gives you for free

Swarm ships inside Docker. There is no control plane to install, no extra component to babysit.

My init playbook is short and rerunnable. It initializes the manager, joins the workers one by one, sets labels, creates networks and secrets.

Overlay networks are encrypted. Secrets are native. Service placement is a matter of node labels.

Swarm is boring. For infrastructure, that is a compliment.

Trap 1: docker stack deploy ignores your .env

First trap, and it surprises everyone. docker compose up reads your .env file and substitutes variables. docker stack deploy ignores it completely.

The symptom is nasty. Your Traefik rules contain a literal app.${DOMAIN} instead of your domain. Nothing crashes. Routing just does not work.

This is a known, accepted limitation (moby issue #29133). It has been open for years.

My workaround: I never hand Swarm a raw compose file. Ansible renders each one from a Jinja2 template, variables already substituted. Sensitive values come from Ansible vault, not from an env file.

Trap 2: the MTU of double encapsulation

The second trap is in the network. My containers talk over VXLAN, the Swarm overlay network. And that VXLAN travels inside WireGuard. Two encapsulations, so two headers to fit in every packet.

The MTU is the maximum packet size on a link. Each encapsulation eats a piece of it.

WireGuard refuses to fragment oversized packets. That is a deliberate design choice. A packet that is too big gets dropped, not split.

The rule fits on one line:

# VXLAN adds ~50 bytes of headers
mtu_docker = mtu_vpn - 50

# in my case: 1280 - 50 = 1230
# /etc/docker/daemon.json
{ "mtu": 1230 }

And the test is reproducible with plain ping:

# 1202 bytes + 28 of ICMP header = 1230: passes
ping -M do -s 1202 100.64.0.2

# 1252 + 28 = 1280: rejected, packet too big
ping -M do -s 1252 100.64.0.2

Forget this setting and TCP mostly survives, because it negotiates its segment size. UDP does not. In my case, metrics were timing out with not one useful error line.

The real price: rigidity

My own internal audit of the setup says it in one phrase: "well-designed but architecturally static". I confirm.

Adding a node takes three steps. A VM definition in Terraform. An entry in the inventory template. A rerun of the init playbook.

Removing a node is worse, because everything is manual. Drain the services, remove the node from the Swarm, destroy the VM. In that order, without slipping. It is my biggest documented pain point.

And the matching risk: a node drops out of the Swarm and Terraform does not know. Nobody brings it back. There is no self-healing.

The dependency Kubernetes does not have: the VPN

The whole Swarm control plane rides on the mesh. The manager advertises its VPN address. Workers join through that address.

The consequence is direct: if the VPN goes down, the orchestrator becomes unreachable. The VPN is not a comfort anymore. It is a foundation.

I accepted that trade with open eyes. In exchange, I get encryption everywhere and a platform I can move to any provider.

When I would still pick Kubernetes

This setup has a domain of validity. Mine: a stable platform, one operator, nodes that almost never change.

I would pick Kubernetes the day nodes have to move on their own. Autoscaling, automatic machine replacement, ephemeral environments.

I would also pick it with several teams deploying. Namespaces, RBAC, operators: that machinery exists for exactly this.

Gartner predicted that 80% of large engineering organizations would run a platform engineering team by 2026. If that is you, take Kubernetes. If you are a team of three, that number is not about you.

This is not "Kubernetes is dead". This is "Kubernetes is a cost". Buy it when it pays you back.

The checklist before you choose

Run this list before creating your cluster, in either direction.

  • Count your nodes: below five, Swarm or even docker compose is often enough
  • Price both bills, the provider's and your own time
  • Overlay on a VPN: mtu_docker = mtu_vpn - 50, verified with ping -M do
  • Never rely on .env with docker stack deploy: render your compose files
  • Write the drain and remove-node playbooks before you need them
  • List what depends on the VPN, and what stays up if it dies
  • Write down today what would make you migrate to Kubernetes

What to remember

A complete platform fits on Swarm for about thirty euros a month. Reliability has not been my problem.

The price is paid elsewhere. Every topology change is a manual project. And the VPN carries everything.

Do the math for your case, not for your resume. The simplest orchestrator that covers your need is the right one.

Torn between Swarm, Kubernetes or something in between for your platform? Let's talk.