在kubeadm集群配置PodSecurityPolicy时遇API Server异常问题
我之前维护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

