打开几年前的集群,发现节点全部NotReady

查看日志
1 |
journalctl -xefu kubelet |
证书过期错误
1 |
Failed to connect to apiserver: the server has asked for the client to provide credentials |

查看证书有效期
1 2 3 4 5 6 |
openssl x509 -in /etc/kubernetes/pki/kubelet.crt -noout -text |grep 'Not' or openssl x509 -noout -enddate -in {证书路径} 发现证书时间2021年就过期了。 |
解决方法:
1、kubeadm 部署的 Kubernetes 解决方法
1 2 3 |
kubernetes 1.15+ 版本可以直接通过命令 kubeadm alpha certs renew <cert_name> 更新。 kubernetes 小于 1.15 版本的,可以参考 https://github.com/yuyicai/update-kube-cert 项目更新 |
2、二进制部署的 Kubernetes 解决方法(本文选用)
1 2 3 4 5 6 7 |
#删除旧的 kubelet 证书文件 rm -f /opt/kubernetes/ssl/kubelet* #重启 kubelet 服务,让 master 重新颁发客户端证书 systemctl daemon-reload systemctl enable kubelet systemctl restart kubelet |
3. 查看新颁发的证书有效期

然后发现问题为解决,依然是这个错误
1 |
Failed to connect to apiserver: the server has asked for the client to provide credentials |
4、查看csr为空(怀疑是时间太久导致token也失效的问题,需要重新将node加入集群)
1 2 3 |
#发现为空 kubectl get csr No resources found. |
5、创建新的token
1 2 |
#创建一个永不失效的token kubeadm token create --ttl=0 |
查看token
1 |
kubeadm token list --kubeconfig ~/.kube/config |

6、重新创建配置文件(本文选择重建),或者复制token把其他配置文件当中的token替换掉
6.1、创建kubelet bootstrap.kubeconfig
1 |
vim environment.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
BOOTSTRAP_TOKEN=gs2vyj.4qilj55vagpcpgqw KUBE_APISERVER="https://192.168.66.187:6443" # 设置集群参数 kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=bootstrap.kubeconfig # 设置客户端认证参数 kubectl config set-credentials kubelet-bootstrap \ --token=${BOOTSTRAP_TOKEN} \ --kubeconfig=bootstrap.kubeconfig # 设置上下文参数 kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=bootstrap.kubeconfig # 设置默认上下文 kubectl config use-context default --kubeconfig=bootstrap.kubeconfig |
执行脚本 environment.sh
6.2、创建kubelet.kubeconfig文件
1 |
vim envkubelet.kubeconfig.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
BOOTSTRAP_TOKEN=gs2vyj.4qilj55vagpcpgqw KUBE_APISERVER="https://192.168.66.187:6443" # 设置集群参数 kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=${KUBE_APISERVER} \ --kubeconfig=kubelet.kubeconfig # 设置客户端认证参数 kubectl config set-credentials kubelet \ --token=${BOOTSTRAP_TOKEN} \ --kubeconfig=kubelet.kubeconfig # 设置上下文参数 kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet \ --kubeconfig=kubelet.kubeconfig # 设置默认上下文 kubectl config use-context default --kubeconfig=kubelet.kubeconfig |
执行脚本 envkubelet.kubeconfig.sh
7、将bootstrap.kubeconfig和kubelet.kubeconfig 文件拷贝覆盖到所有 nodes节点
1 2 3 4 |
scp bootstrap.kubeconfig kubelet.kubeconfig 192.168.66.187:/etc/kubernetes/ scp bootstrap.kubeconfig kubelet.kubeconfig 192.168.66.188:/etc/kubernetes/ scp bootstrap.kubeconfig kubelet.kubeconfig 192.168.66.189:/etc/kubernetes/ |
8、还要记得替换掉api-server配置文件加载的token文件
1 2 3 |
#此文件目录按自己定义目录即可 /etc/kubernetes/ca/kubernetes/token.csv /etc/kubernetes/token.csv |
9、将kubelet-bootstrap用户绑定到系统集群角色
1 2 3 |
kubectl create clusterrolebinding kubelet-bootstrap \ --clusterrole=system:node-bootstrapper \ --user=kubelet-bootstrap |
10、查看kubelet.service,看各个配置文件是否和新生成的名称一致
1 |
vim /usr/lib/systemd/system/kubelet.service |
11、启动kubelet服务
1 2 3 4 5 |
systemctl daemon-reload systemctl enable kubelet systemctl restart kubelet #验证服务启动情况 systemctl status kubelet |
12、查看Node是否已加入集群
1 |
kubectl get csr |

13、在Master审批Node加入集群
1 |
kubectl get csr|grep 'Pending' | awk 'NR>0{print $1}'| xargs kubectl certificate approve |
14、查看节点状态
1 |
kubectl get node |

其他参考解决方案
1 2 3 4 |
#证书过期之kubeadm重新生成证书 https://www.bbsmax.com/A/8Bz8PxXNzx/ #脚本有用 https://www.orchome.com/2002 |
- 本文固定链接: https://www.yoyoask.com/?p=8296
- 转载请注明: shooter 于 SHOOTER 发表