Files
Deploy-Laboratory/docs/04-10-nodejs-安全上下文.md
2026-03-29 09:08:01 +08:00

3.1 KiB
Raw Blame History

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-demo04-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减少被攻击后的影响面。
  • 只读根盘:系统目录不让写;应用要写临时文件,必须单独挂 可写卷(示例用 /tmpemptyDir)。
  • 渐进收紧:先在一个测试命名空间试,再推广;强策略集群可能被准入控制器拦截。

相对 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 Runningid 显示非 rootrunAsUser 一致)。

失败排查

  • 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 widekubectl -n kube-system get pods -o wide
  • 事件与日志kubectl -n <ns> describe ...kubectl -n <ns> logs ... --tail=200