无法在Minikube中启用Pod Security Admission控制器求助
问题分析与解决方案
你遇到的核心问题是:在Kubernetes 1.25.3版本的Minikube/Kind环境中,即使开启了PodSecurity(PSA)特性门控和准入插件,设置了restricted级别的命名空间标签,不符合安全基线的Pod依然能被创建。
关键排查点
1. 准入插件配置错误(最可能原因)
你的Minikube启动命令中,--extra-config=apiserver.enable-admission-plugins=PodSecurity是直接替换默认准入插件列表,而非追加。Kubernetes API Server需要依赖一系列默认准入插件才能正常运行,仅保留PodSecurity会导致整个准入链异常,进而使PSA控制器无法生效。
2. 命名空间标签的版本兼容性
在Kubernetes 1.25中,PSA基线是版本绑定的,若仅指定pod-security.kubernetes.io/enforce: restricted,集群会默认使用对应Kubernetes版本的基线,但明确指定版本可避免模糊匹配问题。
3. 验证PSA组件状态
需确认API Server是否真正加载了PodSecurity插件,以及PSA API是否可用。
修复步骤
1. 修正Minikube启动命令
将PodSecurity追加到默认准入插件列表中:
minikube start --kubernetes-version=v1.25.3 \ --feature-gates=PodSecurity=true \ --extra-config=apiserver.enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,TaintNodesByCondition,Priority,DefaultTolerationSeconds,DefaultStorageClass,StorageObjectInUseProtection,PersistentVolumeClaimResize,RuntimeClass,ResourceQuota,PodSecurity
2. 修正Kind集群配置
若使用Kind,需在cluster.yml中完整配置准入插件和特性门控:
kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane kubeadmConfigPatches: - | apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration featureGates: PodSecurity: true - | apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration apiServer: extraArgs: enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,TaintNodesByCondition,Priority,DefaultTolerationSeconds,DefaultStorageClass,StorageObjectInUseProtection,PersistentVolumeClaimResize,RuntimeClass,ResourceQuota,PodSecurity" featureGates: PodSecurity: true
3. 完善命名空间标签
添加明确的版本标记及警告/审计标签,便于验证:
kind: Namespace metadata: labels: pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/enforce-version: v1.25 pod-security.kubernetes.io/warn: restricted pod-security.kubernetes.io/warn-version: v1.25 pod-security.kubernetes.io/audit: restricted pod-security.kubernetes.io/audit-version: v1.25 name: psa
验证操作
- 检查API Server准入插件加载状态
kubectl get pod -n kube-system $(kubectl get pod -n kube-system | grep kube-apiserver | awk '{print $1}') -o yaml | grep -A 3 enable-admission-plugins
确保输出中包含PodSecurity。
- 测试不安全Pod的创建
直接创建不符合基线的Pod(而非Deployment,避免控制器层级的干扰):
apiVersion: v1 kind: Pod metadata: name: unsecure-pod namespace: psa spec: securityContext: runAsUser: 0 runAsGroup: 0 fsGroup: 0 volumes: - name: etcvol hostPath: path: "/etc" type: Directory containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 securityContext: allowPrivilegeEscalation: true privileged: true capabilities: add: ["NET_ADMIN", "SYS_TIME"]
执行kubectl apply -f pod.yaml,应收到类似如下的拦截提示:
Error from server (Forbidden): error when creating "pod.yaml": pods "unsecure-pod" is forbidden: violates PodSecurity "restricted:v1.25": hostPath volumes (volumes["etcvol"]), privileged container (containers["nginx"]), allowPrivilegeEscalation != false (containers["nginx"]), runAsNonRoot != true (pod or container "nginx"), seccompProfile (pod or container "nginx")
内容的提问来源于stack exchange,提问作者Adam Sandor
相关产品推荐
相关产品推荐

