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 <[email protected]>
Claude-Session: https://claude.ai/code/session_011FqYP3Wf1W63Qmh7qgXAAT
This commit is contained in:
devopsandClaude Sonnet 5 committed 2026-08-17 00:32:05 -05:00
1 parent dcc5bb2d57
commit 827086049c
1 file changed
+18 -11
+18 -11
View File
@@ -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