5 kubelet证书自动续签
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
(2)
node配置
3 二进制部署证书说明
(1)
etcd配置
(2)
master配置
kube-apiserver、kube-controller-manager、kube-scheduler、kubectl、kubelet、kube-proxy
(3)
node配置
kubelet、kube-proxy
(4)
原始证书目录(非常重要,一定要备份)
4 证书过期
(1)
kubeadm部署
官方文档:
https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/
由kubeadm生成的客户端证书在1年后到期,ca是10年。
检查证书是否过期:
# kubeadm certs check-expiration
注:
该命令显示 /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年期限,但也够用了。
红线:K8s自建证书颁发机构(CA),需携带由它生成的客户端证书访问apiserver。
蓝色:Etcd自建证书颁发机构(CA),需携带由它生成的客户端证书访问etcd。
2 查看证书有效期的方法
比如查看kubeadm方式部署的kubelet证书过期时间:
#
cd /var/lib/kubelet/pki/
# openssl x509 -in kubelet-client-current.pem -noout
-dates
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
-
--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
# 默认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
(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
注: 我服务器的时间已经设置为了2022-08-20,但是kubelet证书的起始时间是2021-09-27
(今天的确切日期),说明证书有效期的起始时间不是根据kubelet所在服务器时间计算的,
是由kube-controller-manager所在服务器时间决定的。如果node服务器时间发生改变,
那么在该node上的pod容器时间也会跟着发生变化。
4 k8s其它组件证书有效期续签
(1)
查看证书有效期
[root@k8s-master1 ~]# kubeadm certs
check-expiration
注: 我们可以看到除kubelet客户端证书之外其它k8s组件证书有效期还剩330天。
(2)
续签证书
[root@k8s-master1
~]# kubeadm alpha certs renew all
(3)
重启kube-apiserver,
kube-controller-manager, kube-scheduler and etcd服务应用新的证书
1) 查看相应pod名
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
注: 由于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