更新k8s集群的证书

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就正常了。

 

上一篇:kubeadm安装的k8s集群证书有效期过期解决方案(v1.13.0之后版本)


下一篇:k8s static pod(静态pod)