通过kubeadm安装的kubernetes集群各个组件所使用证书的期限为1年,本实验练习的是到期之后如何续期。
ubernetes环境及版本
整个实验三台机器192.168.32.128作为master,192.168.32.129/130是node,kubernetes的版本是1.23.0。
所使用系统为centos7.6
1.查看证书过期时间
在master上查看各证书的过期时间
[root@master ~r]# kubeadm certs check-expiration
从这里可以看到证书过期时间是到2023年9月23日。
查看master(192.168.32.128)上kubelet证书的过期时间。
[root@master ~]# ls /var/lib/kubelet/pki/
[root@master ~]# openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text |grep Not
这里可以看到过期时间在2023年9月3日。
查看node1(192.168.32.129)上kubelet证书的过期时间。
[root@k8s-node1 ~]# ls /var/lib/kubelet/pki/
[root@k8s-node1 ~]# openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text |grep Not
这里可以node1看到过期时间在2023年9月3日。
查看node2(192.168.32.130)上kubelet证书的过期时间。
[root@k8s-node2 ~]# ls /var/lib/kubelet/pki/
[root@k8s-node2 ~]# openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text |grep Not
这里可以看到node2过期时间在2023年9月3日。
备份相关文件目录
cp -r /etc/kubernetes/ /tmp/backup/ # 静态pods配置以及证书
cp -r /var/lib/ kubernetes /tmp/backup.crr #证书pem存放目录
2.模拟证书过期
把所有系统的时间改为2024年9月5日,在xshell的撰写栏输入命令 。
[root@master ~]# timedatectl set-ntp false ; date -s “2024-09-5 10:00:00” ; hwclock -w
[root@k8s-node1 ~]# timedatectl set-ntp false ; date -s “2024-09-5 10:00:00” ; hwclock -w
[root@k8s-node2 ~]# timedatectl set-ntp false ; date -s “2024-09-5 10:00:00” ; hwclock -w
在master上确认当前时间
再次执行kubectl命令。
[root@master ~]# kubectl get nodes
可以看到现在kubectl已经没法正常使用了,提示证书过期。
3.轮换master上证书
在master(192.168.32.1128)续签所有证书。
查看没续签之前的证书日期:
开始续签:
[root@master kubernetes]# kubeadm certs renew all
在master(192.168.32.128)再次查看证书过期日期。
[root@master kubernetes]# kubeadm certs check-expiration
可以看到过期时间现在已经是1年后了,即到2054年9月5日过期。
查看/etc/kubernetes/pki/证书是否更新了。
[root@master kubernetes]# ll -a /etc/kubernetes/pki/
可以看到证书都重新生成了,并且日期是改变了的。
当前kubernetes各组件所使用的kubeconfig在/etc/kubernetes/里。
[root@master kubernetes]# ll -a /etc/kubernetes/
这些文件里所用到的证书均是之前过期的证书,所以需要把所有的这些kubeconfig文件(后缀为conf)删除重新生成。
[root@master kubernetes]# rm -rf /etc/kubernetes/*.conf
[root@master kubernetes]# ls
manifests pki
为这些组件重新生成kubeconfig文件。
注意版本号
[root@master kubernetes]# kubeadm init --kubernetes-version=v1.23.0 phase kubeconfig all
查看是否生成出来了新的配置文件
[root@master kubernetes]# ll -a /etc/kubernetes/
这里也生成了kubelet所需要的kubeconfig文件,就是上面的kubelet.conf。
重新拷贝管理员所用的新的kubeconfig文件。
备份下/root/kube/config 文件:
cp /root/kube/config /tmp/kube.old/config
替换:
[root@master kubernetes]# cp /etc/kubernetes/admin.conf ~/.kube/config
重启kube-scheduler。
[root@master kubernetes]# docker ps -a | grep kube-scheduler | awk ‘{print $1}’
eb081970183f
7061ee08ac11
[root@master kubernetes]# docker rm -f eb081970183f 7061ee08ac11
eb081970183f
7061ee08ac11
等待kube-scheduler彻底启动起来,即状态为1/1。
[root@master kubernetes]# kubectl get pods -n kube-system | grep scheduler
4.轮换kubelet证书
轮换master上的kubelet证书
查看kubelet当前所使用的证书。
[root@master kubernetes]# ll -a /var/lib/kubelet/pki/
可以看到此处kubelet当前使用的证书还是2022-9-3的,使用的是已经过期的证书,需要生成新的证书。
通过kubeadm alpha certs renew all更新的 k8s 证数,是不会更新 kubelet.conf 的证书的。所以此处的证书重启kubelet cho重新生成。
因为前面已经重新生成了kubelet.conf,现在重启kubelet。
[root@master kubernetes]# systemctl restart kubelet
[root@master kubernetes]# ll -a /var/lib/kubelet/pki/
这里kubelet-client-2024-09-05-10-36-28.pem是新颁发的证书。
此时kubelet-client-current.pem是软连接到kubelet-client-2024-09-05-10-36-28.pem的。
在master上查看证书签名请求(简称为CSR)。
[root@master kubernetes]# kubectl get csr
然后批准此CSR。
[root@master kubernetes]# kubectl certificate approve csr-vg9bd
certificatesigningrequest.certificates.k8s.io/csr-vg9bd approved
查看当前kubelet证书的过期时间。
[root@master kubernetes]# openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text |grep Not
这里显示过期时间到2025年9月5日。
5.轮换node上的kubelet证书
查看当前node1上的kubelet证书
[root@k8s-node1 ~]# ls /var/lib/kubelet/pki/
这里显示的还是之前的旧的证书。
在master(192.168.32.128)上生成worker所需要的kubelet.conf临时放在/tmp下
[root@master tmp]# mkdir -p /tmp/worker
生成node1所需要的kubelet.conf文件。
标红处注意更改成自己的信息
[root@master worker]# kubeadm init --kubernetes-version=v1.23.0 phase kubeconfig kubelet --node-name k8s-node1 --kubeconfig-dir /tmp/worker/
[kubeconfig] Writing “kubelet.conf” kubeconfig file
把此文件拷贝到node1(192.168.32.129)上的/etc/kubernetes/目录里覆盖原来的kubelet.conf。
先备份原先node的kubelet.conf文件:
[root@k8s-node1 kubernetes]# mv /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.old
[root@master worker]# scp /tmp/worker/kubelet.conf [email protected]:/etc/kubernetes/
切换到node1,重启kubelet
[root@k8s-node1 kubernetes]# systemctl restart kubelet
再次查看证书
[root@k8s-node1 kubernetes]# ll -a /var/lib/kubelet/pki/
此时已经生成了新的证书kubelet-client-2024-09-05-11-09-57.pem且kubelet-client-current.pem是连接到此证书的。
查看kubelet证书的过期时间。
[root@k8s-node1 kubernetes]# openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text | grep Not
这里显示过期时间为2025年9月5日。
切换到master(192.168.32.128)上,查看CSR。
[root@master worker]# kubectl get csr
[root@master worker]# kubectl certificate approve csr-hppq2
所有的CSR已经全部批准。
如果有多台worker的话,使用类似的方法操作。
6.测试
在master上创建pod1.yaml内容如下。
[root@master worker]# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod1
name: pod1
spec:
containers:
创建此pod。
[root@master worker]# kubectl apply -f pod1.yaml
pod/pod1 created