# 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`](04-11-nodejs-存储与卷.md))。 ## 清单路径(本课分目录) | 本篇完整清单 | [`ansible/files/04-10/04-10-nodejs-demo.yaml`](../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` 等,应改用多阶段构建把依赖打进镜像只读层,或挂卷到可写路径。 ## 部署与验证 ```bash 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` ## 相关文档 - [`04-11-nodejs-存储与卷.md`](04-11-nodejs-存储与卷.md) - [`04-08-nodejs-资源请求与限制.md`](04-08-nodejs-资源请求与限制.md) ## 排障 - **先看 playbook 输出**:失败时先定位是 deploy/wait/http_check 哪一步。 - **集群侧总览**:`kubectl get nodes -o wide`、`kubectl -n kube-system get pods -o wide`。 - **事件与日志**:`kubectl -n describe ...`、`kubectl -n logs ... --tail=200`。