5 kubelet证书自动续签

如果kubelet证书到期,kubelet将无法使用过期的证书连接apiserver,从而导致kubelet无法正常工

作,日志会给出证书过期错误(x509: certificate has expired or is not yet valid)。

5.1 说明

1 证书分类

K8s证书一般分为两套: K8s组件(apiserver)和Etcd,假如按角色来分,证书分为管理节点和工作节点。

(1) 管理节点: 如果是kubeadm部署则自动生成,如果是二进制部署一般由cfssl或者openssl生成。
(2) 工作节点: 工作节点主要是指kubelet连接apiserver所需的客户端证书,这个证书由
kube-controller-manager组件自动颁发。

 

2 kubeadm部署证书说明

(1) master配置
etcd、kube-apiserver、kube-controller-manager、kube-scheduler、kubectl、kubelet、kube-proxy
​​

5 kubelet证书自动续签_服务器

​​

5 kubelet证书自动续签_服务器_02


5 kubelet证书自动续签_证书过期_03


5 kubelet证书自动续签_客户端_04


(2) node配置

5 kubelet证书自动续签_服务器_05


5 kubelet证书自动续签_证书过期_06

 

3 二进制部署证书说明

(1) etcd配置
​​

5 kubelet证书自动续签_客户端_07

​​
(2) master配置
kube-apiserver、kube-controller-manager、kube-scheduler、kubectl、kubelet、kube-proxy

5 kubelet证书自动续签_证书过期_08

​​

5 kubelet证书自动续签_客户端_09


(3) node配置
kubelet、kube-proxy

5 kubelet证书自动续签_服务器_10


(4) 原始证书目录(非常重要,一定要备份)

5 kubelet证书自动续签_服务器_11

 

4 证书过期

(1) kubeadm部署
官方文档: https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/
由kubeadm生成的客户端证书在1年后到期,ca是10年。

检查证书是否过期:
# kubeadm certs check-expiration
​​

5 kubelet证书自动续签_证书过期_12

​​注: 
该命令显示 /etc/kubernetes/pki 文件夹中的客户端证书以及 kubeadm(admin.conf, controller-manager.conf 和
scheduler.conf)使用的 KUBECONFIG 文件中嵌入的客户端证书的到期时间/剩余时间。
上面的列表中没有包含 kubelet.conf,因为 kubeadm 将 kubelet 配置为自动更新证书。轮换的证书位于目录 /var/lib/kubelet/pki。

(2) 二进制部署
二进制部署etcd、k8s组件的ca证书时间为10年,由于cfssl工具的限制,ca证书只有5年的期限
,相应签发的客户端证书也只有5年期限,但也够用了。

5 kubelet证书自动续签_证书过期_13

​红线:K8s自建证书颁发机构(CA),需携带由它生成的客户端证书访问apiserver。
蓝色:Etcd自建证书颁发机构(CA),需携带由它生成的客户端证书访问etcd。

 

2 查看证书有效期的方法

比如查看kubeadm方式部署的kubelet证书过期时间:
# cd /var/lib/kubelet/pki/
# openssl x509 -in kubelet-client-current.pem -noout -dates
​​

5 kubelet证书自动续签_客户端_14

5.2 kubeadm部署k8s环境下kubelet证书自动续签

官方文档: https://kubernetes.io/zh/docs/tasks/tls/certificate-rotation/

 

1 配置kube-controller-manager组件(master节点)

# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
​​

5 kubelet证书自动续签_服务器_15

​​- --experimental-cluster-signing-duration=87600h0m0s
# kubelet客户端证书颁发有效期设置为10年
- --feature-gates=RotateKubeletServerCertificate=true
# 启用server证书颁发

# 启用server证书颁发配置完成后,重建pod使之生效
# kubectl delete pod kube-controller-manager-k8s-master1 -n kube-system

注: 如果你运行了一个 HA 集群,以上操作需要在所有控制面板节点上执行

 

2 配置kubelet组件(node节点)

# vim /var/lib/kubelet/config.yaml
​​

5 kubelet证书自动续签_服务器_16

​​# 默认kubelet证书轮转已经启用
rotateCertificates: true
注: 
kubelet证书轮询只能在kubelet证书没有过期之前操作,如果kubelet证书已经过期,那么kubelet证书轮转就
不起作用了,并且kubelet服务也无法运行。

 

3 测试

(1) 找一台测试node节点,查看现有客户端证书有效期
# cd /var/lib/kubelet/pki/
# openssl x509 -in kubelet-client-current.pem -noout -dates
​​

5 kubelet证书自动续签_客户端_17

​​
(2) 修改服务器时间,模拟kubelet证书即将到期
# date
Mon Sep 27 16:15:12 CST 2021
# date -s "2022-08-20"
# date
Sat Aug 20 00:00:01 CST 2022

(3) 重启kubelet服务
# systemctl restart kubelet.service

(4) 再次查看证书有效期,发现已经变成十年了
# openssl x509 -in kubelet-client-current.pem -noout -dates

5 kubelet证书自动续签_客户端_18

​注: 我服务器的时间已经设置为了2022-08-20,但是kubelet证书的起始时间是2021-09-27
(今天的确切日期),说明证书有效期的起始时间不是根据kubelet所在服务器时间计算的,
是由kube-controller-manager所在服务器时间决定的。如果node服务器时间发生改变,
那么在该node上的pod容器时间也会跟着发生变化。

 

4 k8s其它组件证书有效期续签

(1) 查看证书有效期
[root@k8s-master1 ~]# kubeadm certs check-expiration
​​

5 kubelet证书自动续签_服务器_19

​​注: 我们可以看到除kubelet客户端证书之外其它k8s组件证书有效期还剩330天。

(2) 续签证书
[root@k8s-master1 ~]# kubeadm alpha certs renew all

5 kubelet证书自动续签_证书过期_20


(3) 重启kube-apiserver, kube-controller-manager, kube-scheduler and etcd服务应用新的证书
1) 查看相应pod名

5 kubelet证书自动续签_证书过期_21

​2) 重启相应服务
[root@k8s-master1 ~]# kubectl delete pod/kube-apiserver-k8s-master1 -n kube-system
[root@k8s-master1 ~]# kubectl delete pod/kube-controller-manager-k8s-master1 -n kube-system
[root@k8s-master1 ~]# kubectl delete pod/kube-scheduler-k8s-master1 -n kube-system
[root@k8s-master1 ~]# kubectl delete pod/etcd-k8s-master1 -n kube-system

(4) 再次查看证书有效期限
[root@k8s-master1 ~]# kubeadm certs check-expiration

5 kubelet证书自动续签_客户端_22

​注: 由于ca证书有效期为10年,所以客户端证书续签最长有效期也为10年。

(5) 注: 如果你运行了一个 HA 集群,以上操作需要在所有控制面板节点上执行。

5.3 二进制部署k8s环境下kubelet证书自动续签

二进制部署etcd、k8s组件的ca证书时间为10年,由于cfssl工具的限制,ca证书只有5年的期限
,相应签发的客户端证书也只有5年期限,所以在5年之前不会出现证书过期的问题。

查看节点证书:
[root@k8s-node2 ~]# cd /opt/kubernetes/ssl
[root@k8s-node2 ssl]# openssl x509 -in kubelet-client-current.pem -noout -dates
​​

5 kubelet证书自动续签_客户端_23