fix(crowdsec) — CUSTOM_HOSTNAME par fieldRef : le value: de #56 ne passait pas l'apply #57

Merged
arcodange merged 1 commits from arcodange/crowdsec-hostname-fieldref into main 2026-09-20 19:58:37 +02:00
1 Commits
Author SHA1 Message Date
arcodangeandClaude Opus 5 977e5c21dc fix(crowdsec) — CUSTOM_HOSTNAME par fieldRef : le value: de #56 ne passait pas l'apply
Helm Charts / Detect changed charts (pull_request) Successful in 21s
Helm Charts / Library charts tool (pull_request) Skipped
Helm Charts / Application charts alloy (pull_request) Skipped
Helm Charts / Application charts chart (pull_request) Skipped
Helm Charts / Application charts grafana (pull_request) Skipped
Helm Charts / Application charts hashicorp-vault (pull_request) Skipped
Helm Charts / Application charts loki (pull_request) Skipped
Helm Charts / Application charts minio (pull_request) Skipped
Helm Charts / Application charts pgbouncer (pull_request) Skipped
Helm Charts / Application charts pgcat (pull_request) Skipped
Helm Charts / Application charts prometheus (pull_request) Skipped
Helm Charts / Application charts redis (pull_request) Skipped
Helm Charts / Application charts crowdsec (pull_request) Successful in 50s
#56 fixait le nom de machine de la LAPI avec un simple `value: crowdsec-lapi`
dans `lapi.env`. Ça rendait correctement, et au runtime Kubernetes retient bien
la dernière des deux définitions — un pod de test le confirmait. Mais ce n'est
pas le runtime qui décide : c'est l'apply, et là ça cassait.

`env` est une liste à clé de fusion (`name`). Le strategic merge patch fusionne
donc les deux entrées CUSTOM_HOSTNAME en UNE, qui porte alors le `valueFrom` du
chart ET notre `value`. L'API refuse :

  Deployment.apps "crowdsec-lapi" is invalid:
  spec.template.spec.containers[0].env[5].valueFrom: Invalid value: "":
  may not be specified when `value` is not empty

ArgoCD a réessayé cinq fois puis s'est arrêté en SyncError. Le Deployment est
resté INCHANGÉ — CrowdSec n'a pas été interrompu, mais le correctif n'était pas
appliqué et l'application restait OutOfSync.

Correctif : un `valueFrom` des deux côtés. La fusion écrase alors proprement le
fieldPath et laisse une seule entrée valide. Comme un fieldRef ne sait lire qu'un
champ du pod, et que tous ceux qu'expose le chart varient (le nom) ou disent
autre chose (`k8s-app`, `type`), on pose un label dédié `machine-name` via
`lapi.podLabels` et on pointe dessus.

Vérifié cette fois sur le chemin qui compte :
  kubectl apply --dry-run=server -o json
→ une SEULE occurrence de CUSTOM_HOSTNAME, pointant sur
  metadata.labels['machine-name'], label valant `crowdsec-lapi`.

La leçon est dans le commentaire du values : `helm template` ne voit rien de
tout ça, le rendu est valide des deux côtés. Seule la fusion avec l'objet vivant
distingue les deux formes.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-20 19:56:46 +02:00