Chapitre 01

Architecture et choix

Avant la première ligne de code, cinq décisions structurent toute la plateforme. Les prendre de travers coûte cher ; les voici, avec ce qui les a motivées.

Niveau avancé  ·  Lecture 12 min  ·  Base Talos 1.14, Kubernetes 1.36

Renseignez votre domaine et vos adresses : les commandes et les fichiers de la page s'adaptent. Les valeurs restent dans votre navigateur et ne nous sont jamais transmises.

01Vue d'ensemble

La plateforme tient dans un cluster Proxmox VE de quatre noeuds avec Ceph. Elle porte deux clusters Kubernetes, chacun dans son propre réseau privé, et une VM routeur qui fait le lien avec Internet.

Schéma
                     Internet
                        |
        203.0.113.35   sortie et WireGuard
        203.0.113.47   ingress demo
        203.0.113.51   ingress mgmt
                        |
             +----------------------+
             |      VM routeur      |  nftables :
             |  Debian, HA Proxmox  |  NAT, DNAT, hairpin
             +----------------------+
                 |              |
      VXLAN 10.20.0.0/24   VXLAN 10.20.1.0/24
      +---------------+    +--------------------+
      | cluster mgmt  |    | cluster demo       |
      | Rancher       |    | 3 control planes   |
      | Argo CD       |    | 2 workers          |
      | Renovate      |    | applications       |
      +---------------+    +--------------------+
                 \              /
              Ceph du cluster Proxmox (pool k8s)
ClusterNoeudsRôle
demo3 control planes, 2 workersLes applications : haute disponibilité, stockage Ceph, ingress public
mgmt1 noeudLes outils qui pilotent : Rancher, Argo CD, Renovate

02Pourquoi Talos Linux

Talos est un système conçu pour une seule chose : faire tourner Kubernetes. Pas de shell, pas de SSH, pas de gestionnaire de paquets. Tout passe par une API, et la configuration d'un noeud est un document YAML déclaratif. Les mises à jour remplacent le système entier, avec retour arrière automatique si le noeud ne redémarre pas.

Pour une plateforme qui doit se mettre à jour seule, c'est exactement ce qu'il faut : il n'y a rien à dériver, rien à bricoler à la main, et un noeud se reconstruit en deux minutes. L'absence de SSH déroute la première semaine, comme un super-héros à qui l'on aurait confisqué sa cape. La deuxième semaine, on ne veut plus revenir en arrière.

Talos sans Omni

Sidero propose Omni, une console de gestion des clusters Talos. Nous ne l'utilisons pas ici : OpenTofu et le fournisseur siderolabs/talos suffisent à générer et appliquer la configuration, et tout reste dans notre dépôt, sans dépendance à un service supplémentaire.

L'image des VM vient de l'Image Factory de Talos, au format nocloud pour l'initialisation par cloud-init, avec l'extension qemu-guest-agent pour que Proxmox voie l'adresse des VM et les arrête proprement.

03Deux clusters plutôt qu'un

Un cluster qui se gère lui-même a un défaut : le jour où il tombe, ses outils de gestion tombent avec lui. Nous séparons donc :

  • le cluster demo, qui porte les applications et rien d'autre ;
  • le cluster mgmt, le QG, qui héberge Rancher, Argo CD et Renovate, et pilote demo à distance.

Si demo casse, la console et le GitOps restent debout pour le réparer. Et l'on peut ajouter demain un cluster de production sans réinstaller les outils.

Un seul noeud pour mgmt

Pour une démonstration, un cluster de gestion à un noeud est acceptable : il s'interrompt quelques minutes pendant ses mises à jour, sans conséquence pour les applications. Pour une offre client, nous le passons à trois noeuds.

04Réseau : SDN VXLAN et routeur

Les noeuds Proxmox sont reliés par un réseau privé (le vRack chez OVH, un VLAN dédié ailleurs) en MTU 9000. Le SDN de Proxmox y crée une zone VXLAN, et un VNet par cluster. L'encapsulation VXLAN coûte 50 octets : la zone et les interfaces des VM sont donc en MTU 8950, sans quoi les gros paquets disparaissent sans bruit.

VNetVNIRéseauCluster
k8s5000500010.20.0.0/24mgmt
k8s5001500110.20.1.0/24demo

Petite convention qui évite bien des recherches : l'identifiant de chaque VM vaut VNI × 1000 + dernier octet de son IP. Le premier control plane de demo, en 10.20.1.11, est donc la VM 5001011.

Une VM routeur Debian relie ces réseaux à Internet. Elle porte les IP publiques, fait le NAT sortant, redirige les ports 80 et 443 de chaque IP d'ingress vers le cluster concerné, et termine le tunnel WireGuard du poste d'administration. C'est un point unique, protégé par la haute disponibilité de Proxmox : si son hôte tombe, elle redémarre ailleurs en deux minutes.

Extrait de /etc/nftables.conf du routeur
table ip nat {
  chain prerouting {
    type nat hook prerouting priority dstnat;
    # ingress demo : l'IP publique vers l'adresse de service de Traefik
    ip daddr 203.0.113.47 tcp dport { 80, 443 } dnat to 10.20.1.100
  }
  chain postrouting {
    type nat hook postrouting priority srcnat;
    # hairpin : un pod qui appelle l'IP publique de son propre cluster
    ip saddr 10.20.1.0/24 ip daddr 10.20.1.100 masquerade
    # sortie de tous les clusters par une seule IP
    ip saddr 10.20.0.0/16 oifname "eth0" snat to 203.0.113.35
  }
}
Le hairpin, ce piège discret

Sans la règle de masquerade interne, un pod qui appelle une application du même cluster par son nom public n'obtient jamais de réponse : le retour part en direct et le client l'ignore. Le symptôme le plus courant : cert-manager qui vérifie son propre défi HTTP et échoue en boucle. Autre détail : la règle DNAT ne doit pas être limitée à l'interface publique, sinon les pods ne sont jamais redirigés.

Dans le cluster, Cilium attribue l'adresse 10.20.1.100 au service Traefik et l'annonce en ARP sur le VNet : le routeur n'a besoin de rien connaître d'autre. L'IP de sortie unique a un autre avantage : c'est la seule adresse à autoriser chez les fournisseurs externes (API DNS, stockage de sauvegarde).

05Stockage : Ceph en direct

Le cluster Proxmox a déjà un Ceph. Plutôt que d'ajouter une couche, les volumes Kubernetes sont des images RBD créées directement par ceph-csi dans un pool dédié, avec un utilisateur Ceph limité à ce pool :

Sur un noeud Proxmox
pveceph pool create k8s --application rbd
ceph auth get-or-create client.k8s \
  mon 'profile rbd' osd 'profile rbd pool=k8s' mgr 'profile rbd pool=k8s'

Résultat : des volumes répliqués trois fois, extensibles à chaud, avec instantanés, et une clé qui ne peut rien faire d'autre que gérer les images de son pool.

Le type de CPU des VM

Les images de ceph-csi depuis la version 3.18 sont compilées pour le niveau x86-64-v3. Avec le type de CPU par défaut ou x86-64-v2-AES, les pods plantent au démarrage sur une instruction illégale, sans message très explicite. Nos VM sont en x86-64-v3, qui reste compatible avec la migration à chaud entre des hôtes récents.

06Des versions volontairement plafonnées

ComposantVersionRemarque
Proxmox VE et Ceph9.2 et Squid 19.2Le socle
Talos Linux1.14Plafonné sous 1.15 dans Renovate
Kubernetes1.36Plafonné sous 1.37 : Rancher 2.15 ne l'accepte pas encore
Cilium1.20
ceph-csi3.18Exige un CPU x86-64-v3
Rancher2.15Décide du plafond de Kubernetes
Argo CDchart 10.11
Velero1.18Avec le plugin AWS 1.14, à faire avancer ensemble

La version la plus récente n'est pas toujours la plus héroïque. Rancher accepte chaque nouvelle version de Kubernetes avec quelques semaines de retard : sans plafond, la mise à jour automatique pousserait les clusters dans une version que la console refuse. Le chapitre 05 montre comment ces plafonds sont posés, et levés le moment venu.

Une plateforme Kubernetes, sans y laisser vos nuits

Nous concevons, montons et exploitons des plateformes Kubernetes sur Proxmox VE pour des équipes qui veulent se consacrer à leur code : mises à jour nocturnes, sauvegardes testées, déploiement en GitOps. Reprise d'un cluster existant, plateforme clé en main ou astreinte : nous intervenons au forfait comme au long cours.