更新k8s集群的证书

k8s集群的证书包括master节点相关证书(apiserver、etcd、proxy)和node节点相关证书(kubelet),默认的有效期都是1年。两类证书的更新方式有所不同。

一、更新master节点相关证书

1.首先,在master节点上执行:

openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt

查看证书的有效期。apiserver.crt可以换成同路径下的其他crt文件。

然后,将/etc/kubernetes/pki文件夹备份一下后,在master节点上执行:

kubeadm alpha certs renew all

之后,再执行openssl命令,查看证书有效期是否更新。

2.在master节点上将/etc/kubernetes目录下的所有配置文件备份,然后执行:

kubeadm alpha kubeconfig user --client-name=admin
kubeadm alpha kubeconfig user --org system:masters --client-name kubernetes-admin  > /etc/kubernetes/admin.conf
kubeadm alpha kubeconfig user --client-name system:kube-controller-manager > /etc/kubernetes/controller-manager.conf
kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:$(hostname) > /etc/kubernetes/kubelet.conf
kubeadm alpha kubeconfig user --client-name system:kube-scheduler > /etc/kubernetes/scheduler.conf

3.用更新后的admin.conf替换/root/.kube/config文件。

如果出现

Unable to connect to the server: x509: certificate is valid for xxxx, not xxxx

的报错,就需要修改/root/.kube/config文件中的cluster.server字段,将其改为master的kubelet监听的ip。这种问题发生在多网卡的情况下。

4.重启所有master节点上的apiserver和scheduler两个系统组件。静态pod的情况见下。

二、更新kubelet相关证书

kubelet的证书通过修改kubelet启动参数配置为自动更新。

1.首先,在master节点上,修改controller manager组件的参数,增加:

kube-controller-manager --experimental-cluster-signing-duration=87600h  --feature-gates=RotateKubeletClientCertificate=true

这两个参数。

对于controller manager运行在静态pod中的情况,在/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正常运行了,则证书更新完成。

三、更新csr资源

执行完以上两步后,集群可能会出现日志无法查看的情况。执行kubectl logs时,报:

Error from server: Get https://xxx:10250/containerLogs/xxx remote error: tls: internal error

这里需要认证一下csr,即certificatesigningrequests,是kubelet向master节点发送的证书认证请求。

执行kubectl get csr,发现有大量的csr处于Pending状态。将这些csr认证通过:

kubectl certificate approve [name]

一一更新后,再查看状态时变为Approved,Issued。此后,再执行kubectl logs就正常了。

四、更新secret

集群中与etcd相关的secret会用到etcd的证书作为字段。这些secret需要根据新生成的etcd证书进行更新。

用kubectl get secret -n kube-system | grep etcd找出所有与etcd相关的secret资源,将里面的xxx.crt和xxx.key字段分别替换为位于/etc/kubernetes/pki/etcd下的,server.crt和server.key经过base64加密后的字符串。

之后,重启etcd和使用到secret的各组件即可。

五、重启apiserver

在所有事情都做完后,最后再重启一下所有master节点上的apiserver组件,不然prometheus上的证书告警可能不会消除。

posted @ 2020-06-11 19:43  右威卫大将军  阅读(5969)  评论(0编辑  收藏  举报