Le blog

Sortie de Mercure 0.23.5 : un Helm chart blindé pour vos clusters Kubernetes

Publié le 07 mai 2026

Mercure v0.23.5 vient de sortir, et le sujet central de cette release est le Helm chart. Si vous faites tourner des hubs sur Kubernetes, cette version durcit les configurations par défaut et intègre des templates de politiques (policies) qui nécessitaient auparavant de patcher le chart ou de les gérer à l'extérieur.

Mercure v0.23.5 : une mise à jour majeure du Helm chart pour sécuriser vos hubs sur Kubernetes. " class="wp-image-12669

Le contexte derrière cette version : nous avons audité un cluster Kubernetes de production. Le constat était sans appel : conteneurs en root, absence de NetworkPolicy, durcissement PodSecurity manquant... La question était de savoir où appliquer les correctifs. La réponse s'est imposée d'elle-même : directement dans le Helm chart open source. En effet, tout utilisateur de Mercure sur un cluster multi-tenant ou haute disponibilité rencontre tôt ou tard ces mêmes contraintes ! La version originale, en anglais, de cet article se trouve sur mon blog. Le détail de cette release se trouve aussi sur GitHub.

#

Templates NetworkPolicy et CiliumNetworkPolicy (opt-in)

Le chart embarque désormais deux nouveaux templates, désactivés par défaut :

  1. Une NetworkPolicy standard pour les clusters dont le CNI l'applique (Calico, Cilium, etc.).
  2. Une CiliumNetworkPolicy pour exploiter les fonctionnalités spécifiques à Cilium, comme l'egress filtré par FQDN et les règles L7.

Il vous suffit d'activer celle supportée par votre CNI et de passer vos listes de règles :

ciliumNetworkPolicy:
  enabled: true
  ingress:
    - fromEntities:
        - ingress
      toPorts:
        - ports:
            - port: "8080"
              protocol: TCP
  egress:
    - toEntities:
        - kube-dns
      toPorts:
        - ports:
            - port: "53"
              protocol: ANY
          rules:
            dns:
              - matchPattern: "*"
    - toFQDNs:
        - matchName: redis.example.com
      toPorts:
        - ports:
            - port: "6379"
              protocol: TCP

Lorsque l'ingress et l'egress sont renseignés, Cilium traite tout ce qui est hors liste comme refusé (default-deny). Cela vous permet de bénéficier d'un default-deny par tenant sans avoir à rédiger vos propres politiques. L'endpointSelector du chart est limité au composant app.kubernetes.io/component: server ; ainsi, le pod de test Helm (qui hérite des labels du sélecteur mais pas de celui du composant) reste hors du périmètre, garantissant le bon fonctionnement de helm test.

#

readOnlyRootFilesystem "out of the box"

Jusqu'à présent, activer securityContext.readOnlyRootFilesystem: true faisait crasher le Pod au premier accès en écriture car Caddy sauvegarde automatiquement sa config sous XDG_CONFIG_HOME=/config. Désormais, le chart monte inconditionnellement /config et /tmp en tant qu'emptyDir, et /data en tant que PVC dans lequel Mercure peut écrire si persistence.enabled: true est activé. 

La bibliothèque Go a également été améliorée : bolt.NewBoltTransport crée maintenant le répertoire parent avant d'ouvrir la base de données, évitant ainsi le crash du hub sur un /data vide.

Voici un extrait de values.yaml pour un fonctionnement rootless avec la v0.23.5 :

podSecurityContext:
  runAsNonRoot: true
  runAsUser: 1000
  runAsGroup: 1000
  fsGroup: 1000
  seccompProfile:
    type: RuntimeDefault
securityContext:
  allowPrivilegeEscalation: false
  capabilities:
    drop: [ALL]
  readOnlyRootFilesystem: true
  runAsNonRoot: true
  runAsUser: 1000
service:
  targetPort: 8080 # Optionnel sur les runtimes modernes

Les runtimes récents (containerd 1.5+, Docker 20.10+) règlent net.ipv4.ip_unprivileged_port_start=0 à l'intérieur du conteneur, permettant à un processus non-privilégié de binder n'importe quel port. Le targetPort: 8080 reste utile comme fallback pour les anciens systèmes.

#

Alignement sur le standard PodSecurity "Restricted"

Le chart propose maintenant des réglages par défaut alignés sur le standard de sécurité Restricted de Kubernetes, sans casser la compatibilité pour les utilisateurs existants :

  • serviceAccount.automount: false (Mercure n'appelle pas l'API Kubernetes).
  • enableServiceLinks: false sur le Pod du hub (évite les fuites de variables d'environnement des services voisins).
  • podSecurityContext.seccompProfile.type: RuntimeDefault.
  • Le Pod de test Helm a également été blindé : image busybox:1.37 figée, profil seccomp activé, suppression de toutes les capacités (capabilities) et système de fichiers en lecture seule.

Le securityContext au niveau du conteneur (suppression de toutes les capacités, système de fichiers en lecture seule, exécution sans privilèges, etc.) reste activable à la demande (opt-in) via la clé securityContext. En effet, basculer ces options par défaut constituerait une rupture de compatibilité (breaking change) majeure pour les utilisateurs d'images personnalisées. Ce changement est donc reporté à une future version du chart.

#

Cache du sélecteur de topics limité à 100k entrées

La taille par défaut du cache des sélecteurs de topics était de 2 560 000 entrées. Avec environ 100 octets par entrée, un hub très sollicité pouvait voir son cache grimper à ~256 Mo. Sur un petit Pod, cela frôlait la GOMEMLIMIT, forçant le runtime Go dans une boucle de Garbage Collection permanente consommant 90% du CPU.Le nouveau défaut est fixé à 100 000 entrées (~10 Mo). Vous pouvez ajuster cette valeur via la directive topic_selector_cache dans le Caddyfile.

#

Mercure Cloud et Mercure Enterprise

Si vous utilisez Mercure Cloud, tous ces réglages de sécurité sont déjà appliqués : nous gérons le cluster pour vous. Vous bénéficiez également des transports de production (Redis, Kafka, Postgres), de l'isolation multi-tenant managée et d'un SLA garanti.

Pour bénéficier du même niveau de durcissement on-premise, des transports haute disponibilité et d'un support prioritaire, tournez-vous vers Mercure Enterprise. De notre côté, nous sommes disponibles pour vous accompagner dans vos problématiques de performance et sécurité !

Kevin Dunglas

Kevin Dunglas

CEO & technical director

Mots-clésChart Helm, Kubernetes, Mercure, Sécurité

Le blog

Pour aller plus loin