由于初期,创建证书的期限只有一年,后来经过重建10年的证书期限后(参考:kubernetes-证书过期,重建证书),稳定运行一年后,再次出现证书问题:
1. 故障的表现:
kubectl get node
NAME STATUS ROLES AGE VERSION
10.2.2.120 Ready,SchedulingDisabled master 2y130d v1.15.5
10.2.2.121 Ready node 2y130d v1.15.5
10.2.2.122 NotReady node 2y150d v1.15.5
10.2.2.123 Ready node 2y140d v1.15.5
可以看到 node:10.2.2.122 状态为NotReady
$ systemctl status kubelet
......
Dec 02 13:39:41 10.2.2.122 kubelet[15499]: E1205 11:39:45.377073 15499 bootstrap.go:179] Unable to read existing bootstrap client config: invalid configuration: [unable to read client-cert /etc/kubernetes/ssl/kubelet-client.crt for default-auth due to open /etc/kubernetes/ssl/kubelet-client.crt: no such file or directory, unable to read client-key /etc/kubernetes/ssl/kubelet-client.key for default-auth due to open /etc/kubernetes/ssl/kubelet-client.key: no such file or directory]
$ systemctl restart kubelet
......
Dec 02 13:39:41 10.2.2.122 kubelet[15499]: E1205 11:39:45.377073 15499 bootstrap.go:179] Unable to read existing bootstrap client config: invalid configuration: [unable to read client-cert /etc/kubernetes/ssl/kubelet-client.crt for default-auth due to open /etc/kubernetes/ssl/kubelet-client.crt: no such file or directory, unable to read client-key /etc/kubernetes/ssl/kubelet-client.key for default-auth due to open /etc/kubernetes/ssl/kubelet-client.key: no such file or directory]
提示证书文件找不到,但是该路径下明明有此文件的:
# ls -l
总用量 32
-rw-r--r-- 1 root root 292 8月 13 2018 ca-config.json
-rw-r--r-- 1 root root 1005 8月 13 2018 ca.csr
-rw-r--r-- 1 root root 211 8月 13 2018 ca-csr.json
-rw------- 1 root root 1675 8月 13 2018 ca-key.pem
-rw-r--r-- 1 root root 1367 8月 13 2018 ca.pem
-rw-r--r-- 1 root root 1050 12月 2 2018 kubelet-client.crt
-rw------- 1 root root 227 12月 2 2018 kubelet-client.key
-rw-r--r-- 1 root root 1115 8月 13 2018 kubelet.crt
-rw------- 1 root root 1675 8月 13 2018 kubelet.key
-rw------- 1 root root 1675 8月 13 2018 kube-proxy-key.pem
-rw-r--r-- 1 root root 1411 8月 13 2018 kube-proxy.pem
记得该节点刚好加入集群的时间刚好是一年,所以怀疑是不是证书又过期了。
2. 解决方法:
检查证书的过期时间:
# 检查根证书到期时间:
[root@master ~]# openssl x509 -noout -enddate -in /etc/kubernetes/ssl/ca.pem
notAfter=Jul 1 05:26:00 2023 GMT
# 检查节点证书到期时间:
[root@10.2.2.122 ~]# openssl x509 -noout -enddate -in /etc/kubernetes/ssl/kubelet-client.crt
notAfter=Dec 2 00:33:00 2019 GMT
上面看到节点证书已经过期了:notAfter=Dec 2 00:33:00 2019 GMT。
由于该集群的安装参考文档部署的,文档提到:kubelet 首次启动时向 kube-apiserver 发送证书签名请求,必须通过后 kubernetes 系统才会将该 Node 加入到集群。(之前已经重建过一次10年的证书,不知道这里节点请求回来的证书文件kubelet-client.crt只有一年)
由于节点证书过期,会自动续期,由于本集群没有配置自动同意授权节点,再查看未授权的 CSR 请求:
$ kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-wF3Abuc1t9lPZm2Kxr7wgyYjZeOKfdlcKF7yWCJemFg 3s kubelet-bootstrap Pending
果然看到有节点请求授权,再同意授权:
$ kubectl certificate approve node-csr-wF3Abuc1t9lPZm2Kxr7wgyYjZeOKfdlcKF7yWCJemFg
certificatesigningrequest.certificates.k8s.io/node-csr-wF3Abuc1t9lPZm2Kxr7wgyYjZeOKfdlcKF7yWCJemFg approved
$ kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-wF3Abuc1t9lPZm2Kxr7wgyYjZeOKfdlcKF7yWCJemFg 2m7s kubelet-bootstrap Approved,Issued
再次查看节点的状态,已经恢复正常:
kubectl get node
NAME STATUS ROLES AGE VERSION
10.2.2.120 Ready,SchedulingDisabled master 2y130d v1.15.5
10.2.2.121 Ready node 2y130d v1.15.5
10.2.2.122 Ready node 2y150d v1.15.5
10.2.2.123 Ready node 2y140d v1.15.5
检查节点kubelet证书的时间:
$ ls -l
...
-rw-r--r-- 1 root root 1050 12月 3 10:16 kubelet-client.crt
-rw------- 1 root root 227 12月 3 10:15 kubelet-client.key
...
openssl x509 -noout -enddate -in /etc/kubernetes/ssl/kubelet-client.crt
notAfter=Dec 3 02:12:00 2020 GMT
上面可以看到,证书续费了一年:notAfter=Dec 3 02:12:00 2020 GMT。
3. 如果,你使用openssl 查询到kubelet的证书快要过期了,想提前处理这个问题:
3.1 先将kubelet-client.key、kubelet-client.crt 改名为_kubelet-client.key、_kubelet-client.crt
3.2 再重启kubelet ,重启kubelet,会自动查找证书,如果没有正确的证书文件会自动请求授权
systemctl restart kubelet
重启kubelet :只要kubelet停止的时间够短,不会影响pod的运行,所以不用担心会导致pod重启。
3.3 使用$ kubectl certificate approve 通过授权
4. 其他
4.1 最后设置自动续期,并自动通过授权,避免此问题再次发生。
5. 疑问:
根证书已经设置了10年的期限,为啥kubelet请求证书只有一年呢?
参考:
1. 部署Node节点.md
2. kubernetes-证书过期,重建证书