Kubelet启动失败:无法创建证书签名请求(Unauthorized)求助
我来帮你排查这个棘手的问题——你遇到的failed to run Kubelet: cannot create certificate signing request: Unauthorized错误,核心原因是Worker节点的kubelet在向Master请求创建证书签名请求(CSR)时没有获得授权,咱们一步步来解决:
1. 先确认Bootstrap Token的有效性
Kubeadm的默认bootstrap token有24小时的有效期,如果你之前生成的token已经过期,就会导致授权失败。在Master节点上执行以下命令检查token状态:
kubeadm token list
如果看到token的TTL显示已过期,或者根本找不到对应的token,重新生成一个新的token:
kubeadm token create
然后重新获取CA哈希值(用你之前的命令),再用新的token执行kubeadm join命令。
2. 检查Master上的RBAC权限配置
Kubeadm依赖RBAC规则来赋予bootstrap节点创建CSR的权限,1.10版本默认会创建system:bootstrappers:kubeadm:default-node-token这个ClusterRoleBinding,如果这个绑定丢失或者权限不对,就会导致Unauthorized错误。
在Master节点上检查该绑定是否存在:
kubectl get clusterrolebinding system:bootstrappers:kubeadm:default-node-token
如果不存在,手动创建这个绑定:
# 创建rbac-bootstrap.yaml文件,内容如下 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: system:bootstrappers:kubeadm:default-node-token roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:node-bootstrapper subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: system:bootstrappers:kubeadm:default-node-token
然后执行:
kubectl apply -f rbac-bootstrap.yaml
3. 清理Worker节点的旧配置并重新Join
有时候kubeadm在第一次join失败后会留下无效的配置文件,导致kubelet启动异常。在Worker节点上执行重置命令:
kubeadm reset
之后不要加--skip-preflight-checks(除非你确认预检查的问题不影响),重新执行完整的join命令:
kubeadm join --token <你的新token> --discovery-token-ca-cert-hash sha256:<你的CA哈希值> master_ip:6443
4. 验证OpenStack环境的网络连通性
因为你的集群部署在OpenStack上,必须确保Worker节点能正常访问Master的6443端口:
- 在Worker节点上执行
telnet master_ip 6443,测试端口是否连通 - 如果不通,检查OpenStack的安全组规则,确保允许Worker节点访问Master的6443端口(TCP协议)
5. 处理日志中的其他警告(非紧急但建议修复)
日志里还有两个警告,虽然不是当前kubelet启动失败的原因,但建议后续修复:
- CNI配置缺失:
No networks found in /etc/cni/net.d,等kubelet正常启动后,部署CNI插件(比如Flannel、Calico)即可解决 - conntrack未安装:在Worker节点上安装conntrack工具:
# Debian/Ubuntu系统 apt-get install conntrack # CentOS/RHEL系统 yum install conntrack-tools
最后验证
完成以上步骤后,在Worker节点上启动kubelet:
systemctl start kubelet
然后查看kubelet日志确认没有Unauthorized错误:
journalctl -u kubelet -f
回到Master节点,查看CSR请求并批准:
# 查看待批准的CSR kubectl get csr # 批准对应Worker节点的CSR kubectl certificate approve <csr-name>
之后执行kubectl get nodes,就能看到新的Worker节点了!
内容的提问来源于stack exchange,提问作者Imed Aouidene

