apiVersion: apps/v1 kind: Deployment metadata: name: app-deployment labels: app: docs-portal spec: replicas: 1 selector: matchLabels: app: docs-portal template: metadata: labels: app: docs-portal spec: # El base fuerza runAsNonRoot: true a nivel pod. La imagen ACTUAL # de docs-portal (nginx:1.27-alpine, sin USER) corre como root -- # aplicar el default del base tal cual rompe el pod # (CreateContainerConfigError). Override explícito acá hasta que # docs-portal adopte dockerfiles/static-nginx.Dockerfile # (nginx-unprivileged, no-root) como cambio de imagen aparte -- # no es parte de esta migración de manifiestos. securityContext: runAsNonRoot: false 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). securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: false capabilities: drop: - ALL add: - NET_BIND_SERVICE resources: requests: cpu: 50m memory: 64Mi limits: cpu: 200m memory: 128Mi