Kubernetes生成大量Pending状态CSR及Pod日志加载失败问题求助
看起来你碰到的这两个问题肯定是关联在一起的——集群里堆了一堆Pending的CSR,大概率导致组件无法完成证书认证/轮换,进而引发TLS通信故障,就是你看Pod日志时遇到的那个remote error: tls: internal error(500错误)。我给你梳理几个实用的排查和解决方向:
先搞清楚这些Pending CSR到底是谁发起的
挑几个典型的Pending CSR,用kubectl describe csr <csr-name>查看详情,重点看Subject和Requestor字段,确认是kubelet节点、kube-proxy还是其他组件的请求。很多时候都是kubelet节点的证书签名请求没被审批,导致kubelet没法正常和API Server通信,自然也就拉取不到Pod日志了。检查自动证书审批机制是否正常
kubeadm默认会配置自动审批节点客户端证书的规则,你可以先确认相关的ClusterRoleBinding是否存在:kubectl get clusterrolebinding | grep certificates.k8s.io:certificatesigningrequests如果发现对应的绑定(比如
system:node-bootstrapper或者system:certificates.k8s.io:certificatesigningrequests:selfnodeclient)不见了,那就是自动审批规则出问题了。你也可以先手动审批几个CSR试试效果:kubectl certificate approve <csr-name>要是审批后Pod日志能正常加载,那基本就锁定是自动审批的问题了。
确认组件实际使用的证书状态
虽然你用kubeadm查证书有效期到明年,但还是要验证一下组件正在使用的证书是否真的没问题:- 检查控制节点API Server的证书:
kubectl exec -n kube-system <kube-apiserver-pod-name> -- openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates - 登录工作节点,检查kubelet的证书(路径一般是
/var/lib/kubelet/pki/kubelet.crt):openssl x509 -in /var/lib/kubelet/pki/kubelet.crt -noout -dates
有时候证书刷新后组件没重启,会一直用旧证书,这也会导致TLS错误。
- 检查控制节点API Server的证书:
检查kube-controller-manager的运行状态
证书审批是由kube-controller-manager负责处理的,先看看它的Pod是不是正常运行:kubectl get pods -n kube-system | grep kube-controller-manager如果Pod状态异常,或者看日志(
kubectl logs -n kube-system <kube-controller-manager-pod-name>)里有报错,比如权限不足、配置错误,那就是控制器出问题导致没法处理CSR了。尝试重新部署证书组件(谨慎操作)
如果你是用kubeadm管理集群,可以尝试重新生成并部署证书组件(记得先备份现有证书目录/etc/kubernetes/pki):kubeadm init phase certs all之后重启控制平面的Pod:
kubectl rollout restart deployment -n kube-system kube-apiserver kube-controller-manager kube-scheduler最后重启所有节点上的kubelet服务:
systemctl restart kubelet
备注:内容来源于stack exchange,提问作者user432024

