1.实验目的 [color=rgba(0, 0, 0, 0.8)]通过kubeadm安装的kubernetes集群各个组件所使用证书的期限为1年,本实验练习的是到期之后如何续期。 2.实验环境[color=rgba(0, 0, 0, 0.8)]kubernetes环境及版本
整个实验两台机器vms28.rhce.cc作为master,vms29.rhce.cc是worker。kubernetes的版本是1.23.1。 root@vms28:~# kubectl get nodesNAME STATUS ROLES AGE VERSIONvms28.rhce.cc Ready control-plane,master 172d v1.23.1vms29.rhce.cc Ready <none> 172d v1.23.1root@vms28:~# [color=rgba(0, 0, 0, 0.8)]所使用系统为Ubuntu 18.04。 root@vms28:~# lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 18.04.5 LTSRelease: 18.04Codename: bionicroot@vms28:~# 3.实验步骤1.查看证书过期时间[color=rgba(0, 0, 0, 0.8)]在master上查看各证书的过期时间。 root@vms28:~# kubeadm certs check-expiration[color=rgba(0, 0, 0, 0.8)] [color=var(--theme-color)]
root@vms28:~#
从这里可以看到证书过期时间是到2023年3月23日。[color=rgba(0, 0, 0, 0.8)]查看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.keyroot@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 GMTroot@vms28:~# [color=rgba(0, 0, 0, 0.8)]这里可以看到过期时间在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.keyroot@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 GMTroot@vms29:~# [color=rgba(0, 0, 0, 0.8)]这里可以看到过期时间在2022年11月3日。 2.模拟证书过期[color=rgba(0, 0, 0, 0.8)]把所有系统的时间改为2023年3月27日,在xshell的撰写栏输入命令 。 timedatectl set-ntp false ; date -s "2023-03-27 10:00:00" ; hwclock -w [color=rgba(0, 0, 0, 0.8)] 目的是能够让命令在两台机器上同时执行,这样两台机器的时间可以保持一致。
[color=var(--theme-color)]
在vms28上确认当前时间 root@vms28:~# dateMon Mar 27 10:00:13 CST 2023root@vms28:~#[color=rgba(0, 0, 0, 0.8)]再次执行kubectl命令。 root@vms28:~# kubectl get nodesUnable 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:22Zroot@vms28:~# [color=rgba(0, 0, 0, 0.8)]可以看到现在kubectl已经没法正常使用了,提示证书过期。 3.轮换master上证书[color=rgba(0, 0, 0, 0.8)]在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:~# [color=rgba(0, 0, 0, 0.8)]在master(vms28.rhce.cc)再次查看证书过期日期。 root@vms28:~# kubeadm certs check-expiration[color=rgba(0, 0, 0, 0.8)] [color=var(--theme-color)]
可以看到过期时间现在已经是1年后了,即到2024年3月26日过期。[color=rgba(0, 0, 0, 0.8)]当前kubernetes各组件所使用的kubeconfig在/etc/kubernetes/里。 root@vms28:~# ls /etc/kubernetes/admin.conf controller-manager.conf kubelet.conf manifests pki scheduler.conf tmproot@vms28:~# [color=rgba(0, 0, 0, 0.8)]这些文件里所用到的证书均是之前过期的证书,所以需要把所有的这些kubeconfig文件(后缀为conf)删除重新生成。 root@vms28:~# rm -rf /etc/kubernetes/*.confroot@vms28:~# root@vms28:~# ls /etc/kubernetes/manifests pki tmproot@vms28:~# [color=rgba(0, 0, 0, 0.8)]为这些组件重新生成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 fileroot@vms28:~#[color=rgba(0, 0, 0, 0.8)]查看是否生成出来了新的配置文件。 root@vms28:~# ls /etc/kubernetes/admin.conf controller-manager.conf kubelet.conf manifests pki scheduler.conf tmproot@vms28:~#[color=rgba(0, 0, 0, 0.8)]这里也生成了kubelet所需要的kubeconfig文件,就是上面的kubelet.conf。 [color=rgba(0, 0, 0, 0.8)]重新拷贝管理员所用的新的kubeconfig文件。 root@vms28:~# cp /etc/kubernetes/admin.conf ~/.kube/configroot@vms28:~# [color=rgba(0, 0, 0, 0.8)]重启kube-scheduler。 root@vms28:~# docker rm -f $(docker ps | awk '/kube-scheduler /{print $1}')d28a97590ac2root@vms28:~#[color=rgba(0, 0, 0, 0.8)]等待kube-scheduler彻底启动起来,即状态为1/1。 root@vms28:~# kubectl get pods -n kube-system | grep schedulerkube-scheduler-vms28.rhce.cc 1/1 Running ...root@vms28:~# 4.轮换kubelet证书轮换master上的kubelet证书[color=rgba(0, 0, 0, 0.8)]查看kubelet当前所使用的证书。 root@vms28:~# ls /var/lib/kubelet/pki/kubelet-client-2021-11-04-03-44-16.pem kubelet-client-current.pem kubelet.crt kubelet.keyroot@vms28:~# [color=rgba(0, 0, 0, 0.8)]这里kubelet-client-current.pem是软连接到kubelet-client-2021-11-04-03-44-16.pem的,使用的仍然是旧证书。 [color=rgba(0, 0, 0, 0.8)]因为前面已经重新生成了kubelet.conf,现在重启kubelet。 root@vms28:~# systemctl restart kubeletroot@vms28:~# ls /var/lib/kubelet/pki/kubelet-client-2021-11-04-03-44-16.pem kubelet-client-current.pem kubelet.keykubelet-client-2023-03-27-10-05-44.pem kubelet.crtroot@vms28:~#[color=rgba(0, 0, 0, 0.8)]这里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.pemroot@vms28:~# [color=rgba(0, 0, 0, 0.8)]此时kubelet-client-current.pem是软连接到kubelet-client-2023-03-27-10-05-44.pem的。 [color=rgba(0, 0, 0, 0.8)]在master上查看证书签名请求(简称为CSR)。 root@vms28:~# kubectl get csrNAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITIONcsr-rn8xc 2m8s kubernetes.io/kube-apiserver-client-kubelet system:node:vms28.rhce.cc <none> Pendingroot@vms28:~# [color=rgba(0, 0, 0, 0.8)]然后批准此CSR。 root@vms28:~# kubectl certificate approve csr-rn8xccertificatesigningrequest.certificates.k8s.io/csr-rn8xc approvedroot@vms28:~# [color=rgba(0, 0, 0, 0.8)]查看当前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 GMTroot@vms28:~# [color=rgba(0, 0, 0, 0.8)]这里显示过期时间到2023年3月26日。 轮换worker上的kubelet证书[color=rgba(0, 0, 0, 0.8)]查看当前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.keyroot@vms29:~#[color=rgba(0, 0, 0, 0.8)]这里显示的还是之前的旧的证书。
在master(vms28)上生成worker所需要的kubelet.conf临时放在/tmp下,这里先清空/tmp里的内容 root@vms28:~# rm -rf /tmp/* ; ls /tmp/root@vms28:~# [color=rgba(0, 0, 0, 0.8)]生成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 fileroot@vms28:~# root@vms28:~# ls /tmp/kubelet.confroot@vms28:~# [color=rgba(0, 0, 0, 0.8)]把此文件拷贝到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:~#[color=rgba(0, 0, 0, 0.8)]切换到vms29,重启kubelet root@vms29:~# systemctl restart kubeletroot@vms29:~# [color=rgba(0, 0, 0, 0.8)]再次查看证书 root@vms29:~# ls /var/lib/kubelet/pki/kubelet-client-2021-11-04-03-45-46.pem kubelet-client-current.pem kubelet.keykubelet-client-2023-03-27-10-12-18.pem kubelet.crtroot@vms29:~#[color=rgba(0, 0, 0, 0.8)]此时已经生成了新的证书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.pemroot@vms29:~# [color=rgba(0, 0, 0, 0.8)]查看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 GMTroot@vms29:~#[color=rgba(0, 0, 0, 0.8)]这里显示过期时间为2024年3月26日。 [color=rgba(0, 0, 0, 0.8)]切换到master(vms28)上,查看CSR。 root@vms28:~# kubectl get csrNAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITIONcsr-hnjzh 32s kubernetes.io/kube-apiserver-client-kubelet system:node:vms29.rhce.cc <none> Pendingcsr-rn8xc 7m5s kubernetes.io/kube-apiserver-client-kubelet system:node:vms28.rhce.cc <none> Approvedroot@vms28:~# [color=rgba(0, 0, 0, 0.8)]批准vms29的这个证书签名请求CSR。 root@vms28:~# kubectl certificate approve csr-hnjzhcertificatesigningrequest.certificates.k8s.io/csr-hnjzh approvedroot@vms28:~# [color=rgba(0, 0, 0, 0.8)]查看现在所有的CSR。 root@vms28:~# kubectl get csrNAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITIONcsr-hnjzh 51s kubernetes.io/kube-apiserver-client-kubelet system:node:vms29.rhce.cc <none> Approvedcsr-rn8xc 7m24s kubernetes.io/kube-apiserver-client-kubelet system:node:vms28.rhce.cc <none> Approvedroot@vms28:~#[color=rgba(0, 0, 0, 0.8)]所有的CSR已经全部批准。
如果有多台worker的话,使用类似的方法操作。 4.测试[color=rgba(0, 0, 0, 0.8)]在master上创建pod1.yaml内容如下。 root@vms28:~# cat pod1.yaml apiVersion: v1kind: Podmetadata: creationTimestamp: null labels: run: pod1 name: pod1spec: containers: - image: nginx imagePullPolicy: IfNotPresent name: pod1 resources: {} dnsPolicy: ClusterFirst restartPolicy: Alwaysstatus: {}root@vms28:~#[color=rgba(0, 0, 0, 0.8)]创建此pod。 root@vms28:~# kubectl apply -f pod1.yaml pod/pod1 createdroot@vms28:~# kubectl get podsNAME READY STATUS RESTARTS AGEpod1 0/1 ContainerCreating 0 2sroot@vms28:~# kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODE pod1 1/1 Running 0 6s 10.244.178.11 vms29.rhce.cc root@vms28:~# [color=rgba(0, 0, 0, 0.8)]可以看到pod正常运行。
|