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
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]>
This commit is contained in:
+37
-7
@@ -23,6 +23,11 @@ crowdsec: &crowdsec_config
|
||||
- name: TZ
|
||||
value: Europe/Paris
|
||||
lapi:
|
||||
# Source stable pour le CUSTOM_HOSTNAME défini plus bas : un fieldRef ne sait
|
||||
# lire qu'un champ du pod, et tous ceux que le chart expose varient (le nom)
|
||||
# ou disent autre chose (`k8s-app`, `type`). Ce label n'existe que pour ça.
|
||||
podLabels:
|
||||
machine-name: crowdsec-lapi
|
||||
strategy:
|
||||
type: Recreate
|
||||
env:
|
||||
@@ -59,17 +64,42 @@ crowdsec: &crowdsec_config
|
||||
# (/etc/crowdsec est un lien vers le PVC crowdsec-config), donc la
|
||||
# comparaison sur `.login` tient dans le temps.
|
||||
#
|
||||
# ⚠ Cette entrée DOIT rester dans `lapi.env` : le chart émet sa propre
|
||||
# définition de CUSTOM_HOSTNAME AVANT d'injecter `.Values.lapi.env`, et en
|
||||
# cas de doublon Kubernetes retient la DERNIÈRE. C'est ce qui permet de
|
||||
# surcharger un champ que le chart n'expose pas. `kubectl apply` avertit
|
||||
# « hides previous definition », c'est attendu.
|
||||
# ⚠ POURQUOI UN fieldRef VERS UN LABEL, ET PAS UN SIMPLE `value:`.
|
||||
#
|
||||
# Ne pas « corriger » en supprimant le rolloutRestartTargets : les
|
||||
# Le chart émet sa propre définition de CUSTOM_HOSTNAME AVANT d'injecter
|
||||
# `.Values.lapi.env`. On se retrouve donc avec deux entrées de même nom, et
|
||||
# au RUNTIME Kubernetes retient bien la dernière — un pod de test le
|
||||
# confirme. Mais ce n'est pas le runtime qui décide ici : c'est l'APPLY.
|
||||
#
|
||||
# `env` est une liste à clé de fusion (`name`). Un strategic merge patch
|
||||
# FUSIONNE donc les deux entrées en une seule. Avec un `value:` en face du
|
||||
# `valueFrom:` du chart, l'objet fusionné porte les deux, et 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
|
||||
# Mesuré le 2026-09-20 : ArgoCD a bouclé cinq fois là-dessus, sync en échec,
|
||||
# Deployment inchangé. `helm template` ne voit rien de tout ça — le rendu
|
||||
# est parfaitement valide, c'est la fusion avec l'objet vivant qui casse.
|
||||
#
|
||||
# Avec un `valueFrom` des deux côtés, la fusion écrase proprement le
|
||||
# fieldPath et laisse UNE entrée valide. Vérifié par
|
||||
# `kubectl apply --dry-run=server -o json` : une seule occurrence, pointant
|
||||
# sur metadata.labels['machine-name'].
|
||||
#
|
||||
# D'où le label `machine-name` posé via lapi.podLabels juste au-dessus : le
|
||||
# fieldRef a besoin d'une source stable, et un label dédié se lit mieux que
|
||||
# de détourner `k8s-app` ou `type`.
|
||||
#
|
||||
# ⚠ Ne pas « simplifier » en `value: crowdsec-lapi`. C'est exactement ce qui
|
||||
# a échoué, et ça échoue à l'apply, pas au rendu.
|
||||
#
|
||||
# Ne pas « corriger » non plus en supprimant le rolloutRestartTargets : les
|
||||
# identifiants arrivent par secretKeyRef, qui ne se recharge pas à chaud.
|
||||
# Sans rollout, la LAPI garderait des identifiants révoqués par Vault.
|
||||
- name: CUSTOM_HOSTNAME
|
||||
value: crowdsec-lapi
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.labels['machine-name']
|
||||
# To enroll the Security Engine to the console
|
||||
- name: ENROLL_KEY
|
||||
value: "cmieq72i3000802jr1wx8kply"
|
||||
|
||||
Reference in New Issue
Block a user