Kubernetes配置runAsUser:0以root运行容器触发PodSecurityPolicy报错如何解决
问题原因
你的Deployment配置本身没有错误,该报错是集群启用了**PodSecurityPolicy(PSP)**准入控制器,当前生效的PSP规则明确禁止容器以UID 0(root用户)运行导致的。
解决步骤
- 先确认集群现有PSP规则
执行如下命令查看集群所有PSP:
kubectl get psp
再查看对应PSP的runAsUser配置:
kubectl describe psp <PSP名称>
如果PSP中runAsUser的规则设置为MustRunAsNonRoot,就会拦截所有runAsUser: 0的Pod创建请求。
- 按需调整PSP规则,共有两种可选方案:
- 方案1:修改现有全局PSP规则
调整runAsUser策略为RunAsAny,或者明确添加允许UID 0的运行范围,示例配置片段如下:
apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: allow-root-psp spec: runAsUser: rule: RunAsAny # 其余配置如seLinux、fsGroup、supplementalGroups等,和你当前在用的PSP保持一致即可
配置完成后,需要绑定对应的RBAC权限,允许Deployment使用的ServiceAccount调用该PSP:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: use-allow-root-psp rules: - apiGroups: ["policy"] resources: ["podsecuritypolicies"] verbs: ["use"] resourceNames: ["allow-root-psp"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: bind-allow-root-sa roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: use-allow-root-psp subjects: - kind: ServiceAccount name: <Deployment使用的ServiceAccount名称,未指定时默认是default> namespace: <Deployment所在的命名空间>
- 方案2:仅为该业务配置专属PSP
如果不想修改全局安全规则影响其他业务,可以单独创建仅允许root运行的PSP,再将RBAC权限绑定到该业务专属的ServiceAccount上即可。
注意事项
Kubernetes v1.21版本开始PodSecurityPolicy已被废弃,后续版本替换为Pod Security Admission(PSA),如果后续有集群升级计划,需要提前做好安全规则的迁移适配。
内容的提问来源于stack exchange,提问作者Rudziankoŭ
相关产品推荐
相关产品推荐

