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

file
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 

目的是能够让命令在两台机器上同时执行,这样两台机器的时间可以保持一致。
file
在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

file
可以看到过期时间现在已经是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正常运行。

相关新闻

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

                                                                                                                                    RHCE9学习指南连载,点击阅读