You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在kubeadm集群配置PodSecurityPolicy时遇API Server异常问题

解决kube-apiserver添加PodSecurityPolicy后消失的问题

我之前维护K8s 1.10集群时也遇到过一模一样的问题,你这种情况大概率是kube-apiserver静态Pod启动失败了——毕竟你修改了它的核心配置,要是参数格式或者依赖没搞定,kubelet就没法把它拉起来,自然kubectl get pods看不到它。下面是具体的排查和修复步骤:

1. 先排查启动失败的原因

因为kubectl已经用不了了,直接去主节点看日志:

  • 查看kubelet的实时日志,能看到apiserver启动失败的具体报错:
    journalctl -u kubelet -f
    
  • 或者直接看apiserver容器的日志文件(如果容器曾启动过):
    cat /var/log/containers/kube-apiserver-*.log
    

最常见的报错是参数格式错误——比如你在--admission-control后面加PodSecurityPolicy时,有没有用英文逗号分隔?有没有不小心加了空格?比如正确的格式应该是:

--admission-control=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota,PodSecurityPolicy

注意逗号是英文的,前后没有空格,否则kube-apiserver会把后面的内容当成无效参数,直接启动失败。

2. 先恢复集群正常运行

如果现在kubectl完全用不了,先把kube-apiserver.yaml里添加的,PodSecurityPolicy删掉,然后重启kubelet让apiserver恢复:

systemctl restart kubelet

等1-2分钟,再执行kubectl get pods -n kube-system,应该就能看到apiserver Pod了。

3. 正确配置PodSecurityPolicy(针对K8s 1.10.1)

K8s 1.10版本的PodSecurityPolicy需要配合RBAC使用,光加admission controller还不够,得先创建对应的PSP、ClusterRole和绑定,否则即使apiserver启动了,集群里的Pod也会因为权限问题无法创建。

步骤1:创建一个基础的Privileged PSP

创建psp-privileged.yaml文件:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: privileged
spec:
  privileged: true
  allowPrivilegeEscalation: true
  allowedCapabilities:
  - '*'
  volumes:
  - '*'
  hostNetwork: true
  hostPorts:
  - min: 0
    max: 65535
  hostIPC: true
  hostPID: true
  runAsUser:
    rule: 'RunAsAny'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'RunAsAny'
  fsGroup:
    rule: 'RunAsAny'

执行创建命令:

kubectl apply -f psp-privileged.yaml

步骤2:创建允许使用该PSP的ClusterRole

创建clusterrole-psp.yaml:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: psp:privileged
rules:
- apiGroups: ['policy']
  resources: ['podsecuritypolicies']
  verbs: ['use']
  resourceNames: ['privileged']

执行创建:

kubectl apply -f clusterrole-psp.yaml

步骤3:绑定ClusterRole到所有ServiceAccount

创建clusterrolebinding-psp.yaml:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: default:psp:privileged
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: psp:privileged
subjects:
- kind: Group
  name: system:serviceaccounts
  apiGroup: rbac.authorization.k8s.io

执行绑定:

kubectl apply -f clusterrolebinding-psp.yaml

步骤4:再次修改kube-apiserver配置

现在回到/etc/kubernetes/manifests/kube-apiserver.yaml,在--admission-control参数的末尾添加,PodSecurityPolicy,确保格式正确(没有空格,英文逗号)。

修改完成后,kubelet会自动重启apiserver,等1-2分钟后执行kubectl get pods -n kube-system,确认apiserver正常运行,再测试创建一个Pod验证PSP是否生效。

内容的提问来源于stack exchange,提问作者pmcgrath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:01:53