EKS v1.22+托管节点集群(除kube-system)禁止Root容器的最优方案咨询
在EKS v1.22+中禁止非kube-system命名空间运行Root容器的方案
为什么你的PodSecurityPolicy(PSP)没生效?
- PSP在Kubernetes 1.21版本已被废弃,1.25版本完全移除。EKS v1.22+虽保留PSP的API,但默认未启用PSP准入控制器,所以你定义的规则不会被强制执行。
- 另外你的PSP配置里
privileged: true是允许特权容器,和禁止Root的需求冲突;就算启用了PSP,还得绑定对应的RBAC资源(Role/RoleBinding等),让目标命名空间的ServiceAccount匹配到该PSP,否则规则也不会生效。
集群级PodSecurityStandard(PSS)是当前最新方案
是的,PSS是Kubernetes官方替代PSP的安全策略方案,从Kubernetes 1.23开始正式稳定,EKS v1.22+完全支持(部分版本需启用准入控制器)。它通过PodSecurity准入控制器强制实施安全标准,无需复杂RBAC绑定,配置更简洁。
具体实现步骤
要实现除kube-system外所有命名空间禁止Root容器,有两种配置方式:
方式1:集群范围默认规则+例外命名空间
通过PodSecurityConfiguration设置集群默认安全标准,同时给kube-system设置例外:
apiVersion: apiserver.config.k8s.io/v1 kind: PodSecurityConfiguration metadata: name: pod-security-config defaults: enforce: "restricted" enforce-version: "latest" audit: "restricted" audit-version: "latest" warn: "restricted" warn-version: "latest" exemptions: namespaces: ["kube-system"] runtimeClasses: [] usernames: []
restricted级别的安全标准默认强制要求容器以非Root用户运行(runAsNonRoot: true),正好匹配你的需求。- 配置应用后,EKS托管集群的API Server会由AWS自动重启生效,无需手动操作,通常几分钟内即可生效。
方式2:命名空间级标签配置
如果不想设置集群默认规则,可给除kube-system外的所有命名空间添加标签,强制启用restricted标准:
- 给目标命名空间打标签:
# 给所有非kube-system的命名空间添加强制规则标签 kubectl label ns --exclude="kube-system" pod-security.kubernetes.io/enforce=restricted kubectl label ns --exclude="kube-system" pod-security.kubernetes.io/enforce-version=latest
- 验证标签是否生效:
kubectl get ns --show-labels | grep -v kube-system
- 当命名空间带有
pod-security.kubernetes.io/enforce=restricted标签时,该命名空间内创建的所有Pod必须满足非Root用户要求,否则会被拒绝。
验证规则是否生效
尝试在非kube-system命名空间创建一个Root用户的Pod:
apiVersion: v1 kind: Pod metadata: name: root-pod namespace: default spec: containers: - name: nginx image: nginx securityContext: runAsUser: 0 # 指定Root用户
创建时会收到类似如下的错误提示,说明规则已生效:
Error from server (Forbidden): error when creating "root-pod.yaml": pods "root-pod" is forbidden: violates PodSecurity "restricted:latest": runAsUser: invalid value 0: must be at least 1
内容的提问来源于stack exchange,提问作者risail
相关产品推荐
相关产品推荐

