2.4 KiB
2.4 KiB
04-08-nodejs-安全上下文
为
nodejs-demo配置 Pod / 容器级securityContext:非 root、只读根文件系统、降权能力等。以集群 PSP/约束与实际镜像为准,逐步收紧。
前置条件
- 已部署
nodejs-demo(04-01)。 - 注意:
node:18-alpine默认用户可能为 root;非 root 运行需镜像内已有可写目录或使用emptyDir挂载(见04-09-nodejs-存储与卷.md)。
清单路径(唯一真源)
| 本篇完整清单 | ansible/files/nodejs-demo/04-08-nodejs-demo.yaml |
| 应用 | kubectl apply -f ansible/files/nodejs-demo/04-08-nodejs-demo.yaml |
场景说明(白话)
- 降权:用非 root 用户跑 Node,减少被攻击后的影响面。
- 只读根盘:系统目录不让写;应用要写临时文件,必须单独挂 可写卷(示例用
/tmp的emptyDir)。 - 渐进收紧:先在一个测试命名空间试,再推广;强策略集群可能被准入控制器拦截。
相对 04-07 的变更(原文 → 新文)
| 位置 | 原文(04-07) |
新文(04-08) |
|---|---|---|
template.spec.securityContext |
(无) | fsGroup: 1000 |
containers[].securityContext |
(无) | runAsNonRoot / runAsUser: 1000 / readOnlyRootFilesystem: true 等 |
volumeMounts / volumes |
仅默认 | emptyDir 挂 /tmp |
若应用需写 node_modules 等,应改用多阶段构建把依赖打进镜像只读层,或挂卷到可写路径。
部署与验证
kubectl apply -f ansible/files/nodejs-demo/04-08-nodejs-demo.yaml
kubectl get pod -l app=nodejs-demo -n default
kubectl exec deploy/nodejs-demo -n default -- id
预期:Pod Running;id 显示非 root(与 runAsUser 一致)。
失败排查
- permission denied:写只读路径;增加
emptyDir/PVC挂载或放宽readOnlyRootFilesystem。 - 镜像必须以非 root UID 可运行:部分官方镜像入口脚本要求 root,需换镜像或自定义 Dockerfile。
- 集群 Pod Security / Kyverno 等策略拦截:读策略报错信息调整字段。
06-01-k3s-networkpolicy-故障排查.md