From 827086049c6fe32ff88cdc33f85cb7e06acb7c49 Mon Sep 17 00:00:00 2001 From: Cristian Felipe Cruz Buitron Date: Mon, 17 Aug 2026 00:32:05 -0500 Subject: [PATCH] fix(docs-portal): no forzar drop de capabilities, rompe el arranque de nginx Detectado en vivo: el pod nuevo crasheaba con 'chown(...) Operation not permitted' -- nginx:1.27-alpine necesita CAP_CHOWN en su propio entrypoint. drop:[ALL] + add:[NET_BIND_SERVICE] no alcanzaba. Se saca la restriccion de capabilities entera para este container (capabilities: null en el patch, unica forma real de anular el drop:[ALL] heredado del base -- omitir el campo u objeto vacio no alcanzan, confirmado en vivo). No es peor que el estado actual en produccion; se resuelve del todo con nginx-unprivileged. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_011FqYP3Wf1W63Qmh7qgXAAT --- workloads/docs-portal/patches/deployment.yaml | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/workloads/docs-portal/patches/deployment.yaml b/workloads/docs-portal/patches/deployment.yaml index 3565ab4..8d4f719 100644 --- a/workloads/docs-portal/patches/deployment.yaml +++ b/workloads/docs-portal/patches/deployment.yaml @@ -26,20 +26,27 @@ spec: containers: - name: app image: gitea.cruzcloud.net/devops/docs-portal:v1.0.116 - # El base saca TODAS las capabilities. Corriendo como root en - # el puerto 80 (privilegiado), eso rompe el bind() -- incluso - # root necesita CAP_NET_BIND_SERVICE si se le sacan las demás. - # Mismo motivo que el runAsNonRoot de arriba: se resuelve del - # todo cuando docs-portal pase a nginx-unprivileged (puerto - # 8080, no privilegiado, no necesita esta capability). + # El base saca TODAS las capabilities. Probado en vivo y + # revertido: con drop: ALL (aunque se agregue NET_BIND_SERVICE + # de vuelta) el propio entrypoint de nginx:1.27-alpine falla al + # arrancar -- necesita CAP_CHOWN para el chown() que hace sobre + # /var/cache/nginx/client_temp en cada arranque ("Operation not + # permitted", confirmado en el log real del pod). No vale la + # pena ir agregando capabilities una por una a ciegas -- se + # deja sin restricción de capabilities, igual que como corre + # hoy en producción (no es peor que el estado actual). Se + # resuelve del todo cuando docs-portal pase a + # nginx-unprivileged (no necesita root ni capabilities + # especiales para nada de esto). securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: false - capabilities: - drop: - - ALL - add: - - NET_BIND_SERVICE + # Ni omitir "capabilities" ni un objeto vacío {} alcanzan + # para anular el drop:[ALL] del base (probado en vivo, los + # dos dejaron el drop:[ALL] heredado intacto). "null" es la + # forma real de borrar un campo heredado en un patch de + # merge de Kubernetes/Kustomize. + capabilities: null resources: requests: cpu: 50m