k8s集群的证书包括master节点相关证书(apiserver、etcd、proxy)和node节点相关证书(kubelet),默认的有效期都是1年。两类证书的更新方式有所不同。
一、更新master节点相关证书
首先,在master节点上执行:
openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt
查看证书的有效期。apiserver.crt可以换成同路径下的其他crt文件。
然后,将/etc/kubernetes/pki文件夹备份一下后,在master节点上执行:
kubeadm alpha certs renew all
之后,再执行openssl命令,查看证书有效期是否更新。
二、更新kubelet相关证书
kubelet的证书通过修改kubelet启动参数配置为自动更新。
1.首先,在master节点上,修改controller manager组件的参数,增加:
kube-controller-manager --experimental-cluster-signing-duration=87600h --feature-gates=RotateKubeletClientCertificate=true
这两个参数。
对于controller manager运行在静态容器中的情况,在/etc/kubernets/manifests目录下编辑controller manager的yaml文件,在启动命令下增加这两项参数。
然后,将此yaml文件移出/etc/kubernets/manifests目录,等几秒钟,再移回来,controller manager的静态pod就会自动重启。
注意,不要直接通过kubectl edit修改静态pod。
对于controller manager运行在物理机上的情况,与下面kubelet的操作类似。
2.在所有节点上,修改kubelet的systemctl的启动命令。在CentOS中位于/etc/systemd/system/kubelet.service.d中,增加:
kubelet --feature-gates=RotateKubeletClientCertificate=true --cert-dir=/var/lib/kubelet/pki --rotate-certificates --rotate-server-certificates
四项参数。
然后执行:
systemctl daemon-reload systemctl restart kubelet
kubelet正常运行了,则证书更新完成。
三、后续操作
执行完以上两步后,集群可能会出现日志无法查看的情况。执行kubectl logs时,报:
Error from server: Get https://xxx:10250/containerLogs/xxx remote error: tls: internal error
这里需要认证一下csr,即请求。执行kubectl get crs,发现有大量的csr处于Pending状态。将这些csr认证通过:
kubectl certificate approve [name]
一一更新后,再查看状态时变为Approved,Issued。此后,再执行kubectl logs就正常了。