深色模式
Pod Security Admission 准入控制
摘要:本文面向需要在集群中强制 Pod 安全基线的 SRE / 平台工程师。覆盖 PSA 的 privileged/baseline/restricted 三档、命名空间标签三种模式、workload 资源与豁免,并澄清 PSP 已被移除、PSA 是其继任者。适用版本:PSA 自 v1.25 GA(stable);本文以 v1.28+ 为准。
重要版本澄清:PSP 不是 v1.30 移除
常见误解
任务常用说法"v1.30 移除 PSP"并不准确。根据 Kubernetes 官方文档与迁移指南:PodSecurityPolicy(PSP)在 v1.21 弃用,在 v1.25 从 API server 中移除;内置 Pod Security Admission(PSA)在 v1.25 达到 GA/stable。因此 v1.25 之后的集群已无 PSP,应统一使用 PSA。下文以 v1.28+ 为基线。[版本相关:如你运维的是 v1.21–v1.24,PSP 仍存在但已弃用,请尽快迁移]
适用版本与前提
- Kubernetes:v1.28+(PSA GA,apiVersion 为内置、无单独 CRD)
- 需要给命名空间打标签或修改准入控制器配置(通常需 cluster-admin)
- 理解 Pod Security Standards 三档(见 K8s 安全模型总览)
核心概念:三档级别
PSA 强制执行 Pod Security Standards,对 Pod 的 SecurityContext 与相关字段提出要求:
| 级别 | 含义 | 典型约束 |
|---|---|---|
privileged | 不受限(仅用于系统组件) | 几乎不检查 |
baseline | 已知最小化攻击面 | 禁止 host namespaces、特权容器、hostPath 等 |
restricted | 严格、遵循 Pod 加固最佳实践 | 要求 runAsNonRoot、丢弃 ALL capabilities、seccompProfile: RuntimeDefault、allowPrivilegeEscalation: false 等 |
命名空间标签:三种模式
PSA 在命名空间级别施加约束。每档级别可配置三种模式:
| 模式 | 行为 |
|---|---|
enforce | 违规 → Pod 被拒绝 |
audit | 违规 → 在审计日志加注解,但放行 |
warn | 违规 → 给用户警告,但放行 |
yaml
# 命名空间标签示例:enforce 用 restricted,warn/audit 用 baseline
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/enforce-version: v1.28
pod-security.kubernetes.io/warn: baseline
pod-security.kubernetes.io/warn-version: latest
pod-security.kubernetes.io/audit: baseline
pod-security.kubernetes.io/audit-version: latest1
2
3
4
5
6
7
2
3
4
5
6
7
enforce 模式可"先 warn 后 enforce"灰度:先设 warn/audit 观察告警与审计日志,确认无违规后再切到 enforce。
推荐落地路径
- 全集群默认命名空间先
warn+audit=restricted,收集噪声。 - 对无法立即达标的命名空间退到
baseline。 - 稳定后把
enforce设为baseline(系统组件友好),对高安全命名空间升到restricted。
Workload 资源与 Pod 模板
Pod 常由 Deployment / Job 等 workload 资源间接创建。PSA 的 audit / warn 模式会作用在 workload 资源上(提前暴露违规),但 enforce 模式只作用在最终 Pod 对象上,不作用在 workload 资源上。这点决定了你必须在 Pod template 上满足策略,否则 Pod 创建会被拒。
Exemptions(豁免)
豁免在准入控制器配置中显式列举,命中后全部模式(enforce/audit/warn)均跳过。维度:
- Usernames:来自豁免用户名的请求
- RuntimeClassNames:指定运行时类的 Pod
- Namespaces:指定命名空间内的 Pod
不要豁免控制器 ServiceAccount
官方文档警告:多数 Pod 由控制器(如 system:serviceaccount:kube-system:replicaset-controller)创建。豁免某用户只豁免其"直接创建 Pod",不豁免其创建 workload 资源。豁免控制器 SA 会隐式豁免所有能创建对应 workload 的用户。仅豁免真正必要的系统命名空间。
指标与可观测性
kube-apiserver 暴露以下 Prometheus 指标:
pod_security_errors_total:评估失败次数(非致命错误可能回退到 restricted 档)pod_security_evaluations_total:评估次数(不含豁免/忽略请求)pod_security_exemptions_total:豁免请求数
可用这些指标监控 PSA 执行健康度与违规趋势。
配置示例(命名空间)
yaml
apiVersion: v1
kind: Namespace
metadata:
name: prod
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/enforce-version: v1.28
pod-security.kubernetes.io/warn: restricted
pod-security.kubernetes.io/audit: restricted1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
bash
# 给已有命名空间打标签
kubectl label namespace prod \
pod-security.kubernetes.io/enforce=restricted \
pod-security.kubernetes.io/enforce-version=v1.28
# 查看某命名空间是否因 PSA 拒绝 Pod
kubectl describe namespace prod | grep -i pod-security1
2
3
4
5
6
7
2
3
4
5
6
7
回滚与清理
- 若
enforce误伤正常 workload:临时把该命名空间enforce降到baseline或privileged,再修复 Pod template 后恢复。 - 命名空间标签可随时
kubectl label --overwrite修改,立即生效。
不要长期停在 privileged
privileged 等于关闭 Pod 安全基线,仅用于 kube-system 等系统命名空间。业务命名空间长期 privileged 会抵消 PSA 价值。
常见问题
- Q:enforce 为什么不检查 Deployment? 设计如此——enforce 只校验最终 Pod 对象,避免 workload 资源被拒导致无法发布。违规会在 Pod 创建阶段报错。
- Q:版本标签有什么用?
enforce-version把策略固定到某 Kubernetes minor 版本发布的 PSS 定义,避免升级后策略语义漂移;latest则跟随当前版本。
参考资料
- Kubernetes 官方文档 - Pod Security Admission,访问日期:2026-10-08。
- Kubernetes 官方文档 - Pod Security Standards,访问日期:2026-10-08。
- Kubernetes 官方文档 - 用命名空间标签强制 PSS,访问日期:2026-10-08。
- Kubernetes 官方文档 - 从 PSP 迁移到 PSA,访问日期:2026-10-08。