K3s 证书轮换

1、K3s默认证书有效期为一年,如下所示

[root@10 tls]# date
2027年 11月 25日 星期四 00:00:21 CST

[root@10 tls]# for i in `ls /home/docker_customized/k3s/server/tls/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done
/home/docker_customized/k3s/server/tls/client-admin.crt
notAfter=Nov 25 02:10:56 2023 GMT
/home/docker_customized/k3s/server/tls/client-auth-proxy.crt
notAfter=Nov 25 02:10:56 2023 GMT
/home/docker_customized/k3s/server/tls/client-ca.crt
notAfter=Nov 22 02:10:56 2032 GMT
/home/docker_customized/k3s/server/tls/client-cloud-controller.crt
notAfter=Nov 25 02:10:56 2023 GMT
/home/docker_customized/k3s/server/tls/client-controller.crt
notAfter=Nov 25 02:10:56 2023 GMT
/home/docker_customized/k3s/server/tls/client-k3s-controller.crt
notAfter=Nov 25 02:10:56 2023 GMT
/home/docker_customized/k3s/server/tls/client-kube-apiserver.crt
notAfter=Nov 25 02:10:56 2023 GMT
/home/docker_customized/k3s/server/tls/client-kube-proxy.crt
notAfter=Nov 25 02:10:56 2023 GMT
/home/docker_customized/k3s/server/tls/client-scheduler.crt
notAfter=Nov 25 02:10:56 2023 GMT
/home/docker_customized/k3s/server/tls/request-header-ca.crt
notAfter=Nov 22 02:10:56 2032 GMT
/home/docker_customized/k3s/server/tls/server-ca.crt
notAfter=Nov 22 02:10:56 2032 GMT
/home/docker_customized/k3s/server/tls/serving-kube-apiserver.crt
notAfter=Nov 25 02:10:56 2023 GMT

2、我们尝试更改系统时间而使证书过期(模拟一年后证书过期情况)

[root@10 k3s]# date -s 2027-11-25
2027年 11月 25日 星期四 00:00:00 CST

[root@10 k3s]# kubectl get no
Unable to connect to the server: x509: certificate has expired or is not yet valid

看到修改时间后证书已经过期

3、尝试重启k3s使其证书轮换

[root@10 k3s]# systemctl restart k3s

[root@10 k3s]# kubectl get no
Unable to connect to the server: x509: certificate has expired or is not yet valid
[root@10 tls]# date
2027年 11月 25日 星期四 00:01:10 CST
[root@10 tls]# ls -hl
总用量 112K
-rw-r--r-- 1 root root 1.1K 11月 25 00:00 client-admin.crt
-rw------- 1 root root  227 11月 25 00:00 client-admin.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:00 client-auth-proxy.crt
-rw------- 1 root root  227 11月 25 00:00 client-auth-proxy.key
-rw-r--r-- 1 root root  526 11月 25 2022 client-ca.crt
-rw------- 1 root root  227 11月 25 2022 client-ca.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:00 client-cloud-controller.crt
-rw------- 1 root root  227 11月 25 00:00 client-cloud-controller.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:00 client-controller.crt
-rw------- 1 root root  227 11月 25 00:00 client-controller.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:00 client-k3s-controller.crt
-rw------- 1 root root  227 11月 25 00:00 client-k3s-controller.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:00 client-kube-apiserver.crt
-rw------- 1 root root  227 11月 25 00:00 client-kube-apiserver.key
-rw------- 1 root root  227 11月 25 2022 client-kubelet.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:00 client-kube-proxy.crt
-rw------- 1 root root  227 11月 25 00:00 client-kube-proxy.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:00 client-scheduler.crt
-rw------- 1 root root  227 11月 25 00:00 client-scheduler.key
-rw-r--r-- 1 root root 1.8K 11月 25 2022 dynamic-cert.json
-rw-r--r-- 1 root root  550 11月 25 2022 request-header-ca.crt
-rw------- 1 root root  227 11月 25 2022 request-header-ca.key
-rw-r--r-- 1 root root  526 11月 25 2022 server-ca.crt
-rw------- 1 root root  227 11月 25 2022 server-ca.key
-rw------- 1 root root 1.7K 11月 25 2022 service.key
-rw-r--r-- 1 root root 1.2K 11月 25 00:00 serving-kube-apiserver.crt
-rw------- 1 root root  227 11月 25 00:00 serving-kube-apiserver.key
-rw------- 1 root root  227 11月 25 2022 serving-kubelet.key
drwx------ 2 root root   84 11月 25 2022 temporary-certs

可以看到重启无效,ca证书未重新生成

4、删除证书,重启k3s

[root@10 tls]# pwd
/home/docker_customized/k3s/server/tls
[root@10 tls]# rm -rf *
[root@10 tls]# ls
[root@10 tls]#
[root@10 tls]# systemctl restart k3s

5、查看ca证书是否生成

[root@10 tls]# ls -hl
总用量 112K
-rw-r--r-- 1 root root 1.1K 11月 25 00:03 client-admin.crt
-rw------- 1 root root  227 11月 25 00:03 client-admin.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:03 client-auth-proxy.crt
-rw------- 1 root root  227 11月 25 00:03 client-auth-proxy.key
-rw-r--r-- 1 root root  526 11月 25 00:03 client-ca.crt
-rw------- 1 root root  227 11月 25 00:03 client-ca.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:03 client-cloud-controller.crt
-rw------- 1 root root  227 11月 25 00:03 client-cloud-controller.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:03 client-controller.crt
-rw------- 1 root root  227 11月 25 00:03 client-controller.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:03 client-k3s-controller.crt
-rw------- 1 root root  227 11月 25 00:03 client-k3s-controller.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:03 client-kube-apiserver.crt
-rw------- 1 root root  227 11月 25 00:03 client-kube-apiserver.key
-rw------- 1 root root  227 11月 25 00:03 client-kubelet.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:03 client-kube-proxy.crt
-rw------- 1 root root  227 11月 25 00:03 client-kube-proxy.key
-rw-r--r-- 1 root root 1.1K 11月 25 00:03 client-scheduler.crt
-rw------- 1 root root  227 11月 25 00:03 client-scheduler.key
-rw-r--r-- 1 root root 1.8K 11月 25 00:03 dynamic-cert.json
-rw-r--r-- 1 root root  550 11月 25 00:03 request-header-ca.crt
-rw------- 1 root root  227 11月 25 00:03 request-header-ca.key
-rw-r--r-- 1 root root  526 11月 25 00:03 server-ca.crt
-rw------- 1 root root  227 11月 25 00:03 server-ca.key
-rw------- 1 root root 1.7K 11月 25 00:03 service.key
-rw-r--r-- 1 root root 1.2K 11月 25 00:03 serving-kube-apiserver.crt
-rw------- 1 root root  227 11月 25 00:03 serving-kube-apiserver.key
-rw------- 1 root root  227 11月 25 00:03 serving-kubelet.key
drwx------ 2 root root   84 11月 25 00:03 temporary-certs

发现所有证书均重新生成

6、查看集群状态是否正常

[root@10 tls]# kubectl get no
Unable to connect to the server: x509: certificate signed by unknown authority

发现证书“未知授权机构签署的证书”,那么这个问题出在了哪里呢。

注意上面使用的是kubectl命令,所以是kubeconfig文件没有替换为最新的,kubeclt默认是被kubeconfig路径为:/root/.kube/config

[root@10 tls]# ls -hl /root/.kube/config
-rw------- 1 root root 1.1K 11月 25 2022 /root/.kube/config

果然没被替换

那k3s 默认kubeconfig路径在这里:

[root@10 tls]# ls -hl /etc/rancher/k3s/
总用量 4.0K
-rw------- 1 root root 1.1K 11月 25 00:04 k3s.yaml

可以看到这个文件是新生成的,那只要拷贝到/root/.kube/config就大功告成了

7、拷贝新的kubeconfig

[root@10 tls]# cp /etc/rancher/k3s/k3s.yaml /root/.kube/config
cp:是否覆盖"/root/.kube/config"? yes
[root@10 tls]# kubectl get no
NAME            STATUS   ROLES    AGE    VERSION
10.202.62.178   Ready    master   5y1d   v1.17.17+k3s-ee1837a5

8、检查其他组件是否正常

coredns

[INFO] plugin/reload: Running configuration MD5 = 4665410bf21c8b272fcfd562c482cb82
CoreDNS-1.6.9
linux/amd64, go1.14.1, 1766568
E1124 16:13:15.316139       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.4/tools/cache/reflector.go:105: Failed to list *v1.Endpoints: Unauthorized
E1124 16:13:15.318914       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.4/tools/cache/reflector.go:105: Failed to list *v1.Namespace: Unauthorized
E1124 16:13:15.319298       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.4/tools/cache/reflector.go:105: Failed to list *v1.Service: Unauthorized
E1124 16:13:16.319234       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.4/tools/cache/reflector.go:105: Failed to list *v1.Endpoints: Unauthorized
E1124 16:13:16.322041       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.4/tools/cache/reflector.go:105: Failed to list *v1.Namespace: Unauthorized
E1124 16:13:16.324034       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.4/tools/cache/reflector.go:105: Failed to list *v1.Service: Unauthorized

发现coredns日志报错

[root@10 tls]# kubectl get secret -n kube-system
NAME                                             TYPE                                  DATA   AGE
attachdetach-controller-token-gwnw4              kubernetes.io/service-account-token   3      5y1d
certificate-controller-token-cz7sj               kubernetes.io/service-account-token   3      5y1d
clusterrole-aggregation-controller-token-hzsz2   kubernetes.io/service-account-token   3      5y1d
coredns-token-k4np2                              kubernetes.io/service-account-token   3      5y1d
cronjob-controller-token-gjmwh                   kubernetes.io/service-account-token   3      5y1d

看到coredns secret依旧使用的旧的

[root@10 tls]# kubectl delete secret coredns-token-k4np2 -n kube-system
secret "coredns-token-k4np2" deleted

[root@10 tls]# kubectl get secret -n kube-system
NAME                                             TYPE                                  DATA   AGE
attachdetach-controller-token-gwnw4              kubernetes.io/service-account-token   3      5y1d
certificate-controller-token-cz7sj               kubernetes.io/service-account-token   3      5y1d
clusterrole-aggregation-controller-token-hzsz2   kubernetes.io/service-account-token   3      5y1d
coredns-token-ckbp4                              kubernetes.io/service-account-token   3      2s
cronjob-controller-token-gjmwh                   kubernetes.io/service-account-token   3      5y1d
[root@10 tls]# docker logs -f 4382b2b8eb7e
.:53
[INFO] plugin/reload: Running configuration MD5 = 4665410bf21c8b272fcfd562c482cb82
CoreDNS-1.6.9
linux/amd64, go1.14.1, 1766568

其他k8s组件操作类似

至此证书轮换已完成

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code