由于初期,创建证书的期限只有一年,后来经过重建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-证书过期,重建证书