kubernetes(1.23)证书过期如何续期
1.实验目的
通过kubeadm安装的kubernetes集群各个组件所使用证书的期限为1年,本实验练习的是到期之后如何续期。
2.实验环境
kubernetes环境及版本
整个实验两台机器vms28.rhce.cc作为master,vms29.rhce.cc是worker。kubernetes的版本是1.23.1。
root@vms28:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
vms28.rhce.cc Ready control-plane,master 172d v1.23.1
vms29.rhce.cc Ready <none> 172d v1.23.1
root@vms28:~#
所使用系统为Ubuntu 18.04。
root@vms28:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.5 LTS
Release: 18.04
Codename: bionic
root@vms28:~#
3.实验步骤
1.查看证书过期时间
在master上查看各证书的过期时间。
root@vms28:~# kubeadm certs check-expiration
root@vms28:~#
从这里可以看到证书过期时间是到2023年3月23日。
查看master(vms28.rhce.cc)上kubelet证书的过期时间。
root@vms28:~# ls /var/lib/kubelet/pki/
kubelet-client-2021-11-04-03-44-16.pem kubelet-client-current.pem kubelet.crt kubelet.key
root@vms28:~#
root@vms28:~# openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text |grep Not
Not Before: Nov 3 19:44:13 2021 GMT
Not After : Nov 3 19:44:15 2022 GMT
root@vms28:~#
这里可以看到过期时间在2022年11月3日。
查看worker(vms29.rhce.cc)上kubelet证书的过期时间。
root@vms29:~# ls /var/lib/kubelet/pki/
kubelet-client-2021-11-04-03-45-46.pem kubelet-client-current.pem kubelet.crt kubelet.key
root@vms29:~#
root@vms29:~# openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text |grep Not
Not Before: Nov 3 19:40:46 2021 GMT
Not After : Nov 3 19:40:46 2022 GMT
root@vms29:~#
这里可以看到过期时间在2022年11月3日。
2.模拟证书过期
把所有系统的时间改为2023年3月27日,在xshell的撰写栏输入命令 。
timedatectl set-ntp false ; date -s "2023-03-27 10:00:00" ; hwclock -w
目的是能够让命令在两台机器上同时执行,这样两台机器的时间可以保持一致。
在vms28上确认当前时间
root@vms28:~# date
Mon Mar 27 10:00:13 CST 2023
root@vms28:~#
再次执行kubectl命令。
root@vms28:~# kubectl get nodes
Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2023-03-27T10:00:27+08:00 is after 2023-03-23T08:09:22Z
root@vms28:~#
可以看到现在kubectl已经没法正常使用了,提示证书过期。
3.轮换master上证书
在master(vms28.rhce.cc)续签所有证书。
root@vms28:~# kubeadm certs renew all
[renew] Reading configuration from the cluster...
[renew] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
...输出...
Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.
root@vms28:~#
在master(vms28.rhce.cc)再次查看证书过期日期。
root@vms28:~# kubeadm certs check-expiration
可以看到过期时间现在已经是1年后了,即到2024年3月26日过期。
当前kubernetes各组件所使用的kubeconfig在/etc/kubernetes/里。
root@vms28:~# ls /etc/kubernetes/
admin.conf controller-manager.conf kubelet.conf manifests pki scheduler.conf tmp
root@vms28:~#
这些文件里所用到的证书均是之前过期的证书,所以需要把所有的这些kubeconfig文件(后缀为conf)删除重新生成。
root@vms28:~# rm -rf /etc/kubernetes/*.conf
root@vms28:~#
root@vms28:~# ls /etc/kubernetes/
manifests pki tmp
root@vms28:~#
为这些组件重新生成kubeconfig文件。
root@vms28:~# kubeadm init --kubernetes-version=v1.23.1 phase kubeconfig all
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
root@vms28:~#
查看是否生成出来了新的配置文件。
root@vms28:~# ls /etc/kubernetes/
admin.conf controller-manager.conf kubelet.conf manifests pki scheduler.conf tmp
root@vms28:~#
这里也生成了kubelet所需要的kubeconfig文件,就是上面的kubelet.conf。
重新拷贝管理员所用的新的kubeconfig文件。
root@vms28:~# cp /etc/kubernetes/admin.conf ~/.kube/config
root@vms28:~#
重启kube-scheduler。
root@vms28:~# docker rm -f $(docker ps | awk '/kube-scheduler /{print $1}')
d28a97590ac2
root@vms28:~#
等待kube-scheduler彻底启动起来,即状态为1/1。
root@vms28:~# kubectl get pods -n kube-system | grep scheduler
kube-scheduler-vms28.rhce.cc 1/1 Running ...
root@vms28:~#
4.轮换kubelet证书
轮换master上的kubelet证书
查看kubelet当前所使用的证书。
root@vms28:~# ls /var/lib/kubelet/pki/
kubelet-client-2021-11-04-03-44-16.pem kubelet-client-current.pem kubelet.crt kubelet.key
root@vms28:~#
这里kubelet-client-current.pem是软连接到kubelet-client-2021-11-04-03-44-16.pem的,使用的仍然是旧证书。
因为前面已经重新生成了kubelet.conf,现在重启kubelet。
root@vms28:~# systemctl restart kubelet
root@vms28:~# ls /var/lib/kubelet/pki/
kubelet-client-2021-11-04-03-44-16.pem kubelet-client-current.pem kubelet.key
kubelet-client-2023-03-27-10-05-44.pem kubelet.crt
root@vms28:~#
这里kubelet-client-2023-03-27-10-05-44.pem是新颁发的证书。
root@vms28:~# ls -l /var/lib/kubelet/pki/kubelet-client-current.pem
lrwxrwxrwx 1 root root 59 Mar 27 10:05 /var/lib/kubelet/pki/kubelet-client-current.pem -> /var/lib/kubelet/pki/kubelet-client-2023-03-27-10-05-44.pem
root@vms28:~#
此时kubelet-client-current.pem是软连接到kubelet-client-2023-03-27-10-05-44.pem的。
在master上查看证书签名请求(简称为CSR)。
root@vms28:~# kubectl get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-rn8xc 2m8s kubernetes.io/kube-apiserver-client-kubelet system:node:vms28.rhce.cc <none> Pending
root@vms28:~#
然后批准此CSR。
root@vms28:~# kubectl certificate approve csr-rn8xc
certificatesigningrequest.certificates.k8s.io/csr-rn8xc approved
root@vms28:~#
查看当前kubelet证书的过期时间。
root@vms28:~# openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text |grep Not
Not Before: Nov 3 19:44:13 2021 GMT
Not After : Mar 26 02:04:42 2024 GMT
root@vms28:~#
这里显示过期时间到2023年3月26日。
轮换worker上的kubelet证书
查看当前vms29上的kubelet证书
root@vms29:~# ls /var/lib/kubelet/pki/
kubelet-client-2021-11-04-03-45-46.pem kubelet-client-current.pem kubelet.crt kubelet.key
root@vms29:~#
这里显示的还是之前的旧的证书。
在master(vms28)上生成worker所需要的kubelet.conf临时放在/tmp下,这里先清空/tmp里的内容
root@vms28:~# rm -rf /tmp/* ; ls /tmp/
root@vms28:~#
生成vms29所需要的kubelet.conf文件。
root@vms28:~# kubeadm init --kubernetes-version=v1.23.1 phase kubeconfig kubelet --node-name vms29.rhce.cc --kubeconfig-dir /tmp/
[kubeconfig] Writing "kubelet.conf" kubeconfig file
root@vms28:~#
root@vms28:~# ls /tmp/
kubelet.conf
root@vms28:~#
把此文件拷贝到vms29上的/etc/kubernetes/目录里覆盖原来的kubelet.conf。
root@vms28:~# scp /tmp/kubelet.conf 192.168.26.29:/etc/kubernetes/
root@192.168.26.29's password:
kubelet.conf 100% 5685 4.7MB/s 00:00
root@vms28:~#
切换到vms29,重启kubelet
root@vms29:~# systemctl restart kubelet
root@vms29:~#
再次查看证书
root@vms29:~# ls /var/lib/kubelet/pki/
kubelet-client-2021-11-04-03-45-46.pem kubelet-client-current.pem kubelet.key
kubelet-client-2023-03-27-10-12-18.pem kubelet.crt
root@vms29:~#
此时已经生成了新的证书kubelet-client-2023-03-27-10-12-18.pem,且kubelet-client-current.pem是连接到此证书的。
root@vms29:~# ls -l /var/lib/kubelet/pki/kubelet-client-current.pem
...输出10:12 /var/lib/kubelet/pki/kubelet-client-current.pem -> /var/lib/kubelet/pki/kubelet-client-2023-03-27-10-12-18.pem
root@vms29:~#
查看kubelet证书的过期时间。
root@vms29:~# openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text |grep Not
Not Before: Nov 3 19:44:13 2021 GMT
Not After : Mar 26 02:10:27 2024 GMT
root@vms29:~#
这里显示过期时间为2024年3月26日。
切换到master(vms28)上,查看CSR。
root@vms28:~# kubectl get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-hnjzh 32s kubernetes.io/kube-apiserver-client-kubelet system:node:vms29.rhce.cc <none> Pending
csr-rn8xc 7m5s kubernetes.io/kube-apiserver-client-kubelet system:node:vms28.rhce.cc <none> Approved
root@vms28:~#
批准vms29的这个证书签名请求CSR。
root@vms28:~# kubectl certificate approve csr-hnjzh
certificatesigningrequest.certificates.k8s.io/csr-hnjzh approved
root@vms28:~#
查看现在所有的CSR。
root@vms28:~# kubectl get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-hnjzh 51s kubernetes.io/kube-apiserver-client-kubelet system:node:vms29.rhce.cc <none> Approved
csr-rn8xc 7m24s kubernetes.io/kube-apiserver-client-kubelet system:node:vms28.rhce.cc <none> Approved
root@vms28:~#
所有的CSR已经全部批准。
如果有多台worker的话,使用类似的方法操作。
4.测试
在master上创建pod1.yaml内容如下。
root@vms28:~# cat pod1.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod1
name: pod1
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: pod1
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
root@vms28:~#
创建此pod。
root@vms28:~# kubectl apply -f pod1.yaml
pod/pod1 created
root@vms28:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod1 0/1 ContainerCreating 0 2s
root@vms28:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod1 1/1 Running 0 6s 10.244.178.11 vms29.rhce.cc
root@vms28:~#
可以看到pod正常运行。