3.1 KiB
3.1 KiB
04-10-nodejs-安全上下文
为
nodejs-demo配置 Pod / 容器级securityContext:非 root、只读根文件系统、降权能力等。以集群 PSP/约束与实际镜像为准,逐步收紧。
TL;DR
- 手动练习:复制本课目录
ansible/files/04-10/下清单到目标路径,按需改字段后按本文kubectl/bash 操作(学习路径可不使用 verify)。 - 自动化验收:
./ansible/bin/verify.sh run 04-10 - 关键前置:按本文「前置条件」准备环境变量/Secret/入口 IP
- 成功判据:达到本文「预期」且 playbook 断言通过
- 排障:见本文「排障」
前置条件
- 已部署
nodejs-demo(04-01)。 - 注意:
node:18-alpine默认用户可能为 root;非 root 运行需镜像内已有可写目录或使用emptyDir挂载(见04-11-nodejs-存储与卷.md)。
清单路径(本课分目录)
| 本篇完整清单 | ansible/files/04-10/04-10-nodejs-demo.yaml |
| 应用 | kubectl apply -f ansible/files/04-10/04-10-nodejs-demo.yaml |
场景说明(白话)
- 降权:用非 root 用户跑 Node,减少被攻击后的影响面。
- 只读根盘:系统目录不让写;应用要写临时文件,必须单独挂 可写卷(示例用
/tmp的emptyDir)。 - 渐进收紧:先在一个测试命名空间试,再推广;强策略集群可能被准入控制器拦截。
相对 04-09 的变更(原文 → 新文)
| 位置 | 原文(04-09) |
新文(04-10) |
|---|---|---|
template.spec.securityContext |
(无) | fsGroup: 1000 |
containers[].securityContext |
(无) | runAsNonRoot / runAsUser: 1000 / readOnlyRootFilesystem: true 等 |
volumeMounts / volumes |
仅默认 | emptyDir 挂 /tmp |
若应用需写 node_modules 等,应改用多阶段构建把依赖打进镜像只读层,或挂卷到可写路径。
部署与验证
kubectl apply -f ansible/files/04-10/04-10-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
相关文档
排障
- 先看 playbook 输出:失败时先定位是 deploy/wait/http_check 哪一步。
- 集群侧总览:
kubectl get nodes -o wide、kubectl -n kube-system get pods -o wide。 - 事件与日志:
kubectl -n <ns> describe ...、kubectl -n <ns> logs ... --tail=200。