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
Owner

Correctif de #56, qui ne s'appliquait pas. CrowdSec n'a pas été interrompu — le Deployment est resté inchangé — mais l'Application ArgoCD était en SyncError et le correctif n'avait aucun effet.

Ce qui n'allait pas

#56 fixait le nom de machine avec un simple value: crowdsec-lapi dans lapi.env. Le rendu était valide, 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 ici, c'est l'apply.

env est une liste à clé de fusion (name). Le strategic merge patch fusionne donc les deux entrées CUSTOM_HOSTNAME en une seule, 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 correctif

Un valueFrom des deux côtés. La fusion écrase alors proprement le fieldPath et laisse une seule entrée valide.

Un fieldRef ne sait lire qu'un champ du pod, et tous ceux qu'expose le chart varient (le nom) ou disent autre chose (k8s-app, type). On pose donc un label dédié machine-name via lapi.podLabels, et on pointe dessus.

Vérification

Cette fois sur le chemin qui compte — kubectl apply --dry-run=server -o json contre le Deployment vivant :

occurrences de CUSTOM_HOSTNAME après fusion : 1
  {"name": "CUSTOM_HOSTNAME",
   "valueFrom": {"fieldRef": {"fieldPath": "metadata.labels['machine-name']"}}}
  label machine-name : crowdsec-lapi

La leçon, consignée dans le values

helm template ne voit rien de tout ça : le rendu est valide dans les deux formes. Seule la fusion avec l'objet vivant les distingue. Le commentaire du values.yaml dit explicitement de ne pas « simplifier » en value:, et pourquoi.

🤖 Generated with Claude Code

Correctif de #56, qui ne s'appliquait pas. **CrowdSec n'a pas été interrompu** — le Deployment est resté inchangé — mais l'Application ArgoCD était en `SyncError` et le correctif n'avait aucun effet. ## Ce qui n'allait pas #56 fixait le nom de machine avec un simple `value: crowdsec-lapi` dans `lapi.env`. Le rendu était valide, 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 ici, c'est **l'apply**. `env` est une liste à **clé de fusion** (`name`). Le strategic merge patch fusionne donc les deux entrées `CUSTOM_HOSTNAME` en **une seule**, 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 correctif Un `valueFrom` **des deux côtés**. La fusion écrase alors proprement le `fieldPath` et laisse une seule entrée valide. Un `fieldRef` ne sait lire qu'un champ du pod, et tous ceux qu'expose le chart varient (le nom) ou disent autre chose (`k8s-app`, `type`). On pose donc un label dédié `machine-name` via `lapi.podLabels`, et on pointe dessus. ## Vérification Cette fois sur le chemin qui compte — `kubectl apply --dry-run=server -o json` contre le Deployment vivant : ```json occurrences de CUSTOM_HOSTNAME après fusion : 1 {"name": "CUSTOM_HOSTNAME", "valueFrom": {"fieldRef": {"fieldPath": "metadata.labels['machine-name']"}}} label machine-name : crowdsec-lapi ``` ## La leçon, consignée dans le values `helm template` ne voit rien de tout ça : le rendu est valide dans les deux formes. Seule la fusion avec l'objet vivant les distingue. Le commentaire du `values.yaml` dit explicitement de ne pas « simplifier » en `value:`, et pourquoi. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
arcodange added 1 commit 2026-09-20 19:57:04 +02:00
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
977e5c21dc
#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]>
arcodange merged commit e6720bdd40 into main 2026-09-20 19:58:36 +02:00
arcodange deleted branch arcodange/crowdsec-hostname-fieldref 2026-09-20 19:58:37 +02:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: arcodange-org/tools#57