From 81b024edd6956919f397143a2b934e2b145f3666 Mon Sep 17 00:00:00 2001 From: ilopez Date: Mon, 25 May 2026 10:13:03 -0500 Subject: [PATCH] fix(chart): NetworkPolicy como Helm hook weight -8 (no resource normal) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Chicken-and-egg encontrado en smoke E2E DO (cluster 91c93c9c): - ns 'apps' tiene default-deny NetworkPolicy entregada por stack-deployer. - Job Alembic (pre-install hook) ejecuta InitContainer wait-for-secret que hace REST API call al kube-apiserver para chequear Secret. - La NetworkPolicy del chart (que permite DNS + apiserver egress) estaba como RESOURCE NORMAL, asi que solo se aplicaba en la FASE PRINCIPAL del helm install, DESPUES de los hooks. - Resultado: el InitContainer del hook quedaba bloqueado DNS por default-deny → curl timeout 240s → helm install fail → NetworkPolicy nunca se aplica. Fix: - Annotations 'helm.sh/hook: pre-install,pre-upgrade' + 'hook-weight: -8' + 'hook-delete-policy: before-hook-creation'. - Weight ordering: -10 AddonClaim → -8 NetworkPolicy → -7 Role/RoleBinding → -5 SA → 0 Job Alembic. - delete-policy: before-hook-creation (no hook-succeeded): el Deployment de la fase principal necesita la NP viva en runtime. - Comentario en la regla egress :443 aclarando que cubre kube-apiserver (10.43.0.1) + Harbor (sin necesidad de regla adicional). Co-Authored-By: Claude Opus 4.7 --- helm/APP_NAME/templates/networkpolicy.yaml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/helm/APP_NAME/templates/networkpolicy.yaml b/helm/APP_NAME/templates/networkpolicy.yaml index 465568b..309309a 100644 --- a/helm/APP_NAME/templates/networkpolicy.yaml +++ b/helm/APP_NAME/templates/networkpolicy.yaml @@ -3,12 +3,30 @@ # - Ingress: rke2-ingress-nginx (web-backend público) + Prometheus (scrape de /metrics). # - Egress: DNS, Harbor (pull en startup), ns-addons del tenant (BD). # Nota: el cluster tenant usa rke2-ingress-nginx en kube-system, NO Traefik. +# Materializada como Helm hook (pre-install/pre-upgrade, weight "-8") para que +# este disponible ANTES de que el Job Alembic (hook weight 0) ejecute su +# InitContainer wait-for-secret — el InitContainer hace REST API call al +# kube-apiserver y necesita egress DNS + API permitidos. Sin esto, el chicken- +# and-egg con default-deny del namespace `apps` (entregado por stack-deployer) +# bloquea el hook → curl falla DNS → Job timeout → helm install fail → la +# NetworkPolicy nunca se aplica en la fase principal. +# +# Weight ordering (mas chico = antes): +# -10 AddonClaim -> -8 NetworkPolicy -> -7 Role/RoleBinding -> -5 SA -> 0 Job Alembic +# +# delete-policy: before-hook-creation (NO hook-succeeded): la fase principal del +# Deployment necesita la NetworkPolicy viva en runtime; solo se borra/recrea al +# inicio del proximo hook (idempotente entre upgrades). apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: {{ .Release.Name }} labels: {{- include "app.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": pre-install,pre-upgrade + "helm.sh/hook-weight": "-8" + "helm.sh/hook-delete-policy": before-hook-creation spec: podSelector: matchLabels: @@ -58,7 +76,9 @@ spec: port: 3306 - protocol: TCP port: 6033 - # Harbor pull (registro de imágenes) + # kube-apiserver (10.43.0.1:443) y Harbor pull (registro de imágenes). + # 0.0.0.0/0:443 cubre ambos. El InitContainer wait-for-secret del Job + # Alembic necesita egress al apiserver para hacer GET secret via REST API. - to: - ipBlock: cidr: 0.0.0.0/0