0


k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式

大纲

  • 基础概念
  • 证书替换测试
  • 使用kubeadm alpha certs renew all 更新证书
  • 重启所有组件和kubelet.service
  • 生成kubelet-client-current.pem证书
  • 测试替换后集群是否正常工作

基础概念

本次测试使用的k8s集群使用 kubeadm创建单master节点 并且 版本为17 操作系统ubuntu18

在这里插入图片描述

k8s集群之间的访问会使用到证书,如果使用kubeadm搭建的集群,默认CA证书的有效期为10年,其他组件访问证书的有效期为1年。如果过期后没有更新证书可能会引起k8s集群的不可用

例如使用 kubeadm certs check-expiration命令可以查看当前集群证书情况

注意k8s-17 certs命令还是实验性功能 需要 指定alpha 
kubeadm alpha certs check-expiration

在这里插入图片描述

证书替换的整体流程如下

  • 1 使用 kubeadm alpha certs renew all 更新证书
  • 2 使用 重启k8s组件
  • 3 更新节点kubelet-client-current.pem证书
  • 4 重启kubelet.service

注意测试前最好先备份相关证书和配置

  • 1 master节点 /etc/kubernetes文件夹中的 admin.conf ,controller-manager.conf, kubelet.conf ,scheduler.conf 和 pki文件夹中所有证书
  • 2 node节点 /etc/kubernetes文件夹的 kubelet.conf 和 pki文件夹中所有证书

证书替换测试

使用 kubeadm alpha certs check-expiration 查看当前证书情况

kubeadm alpha certs check-expiration

在这里插入图片描述

手动修改系统时间让证书过期注意需要先关闭ntp (所有节点都执行此命令包括master节点)

timedatectl set-ntp false  关闭ntp  (timedatectl set-ntp true 开启ntp)
date -s 04/27/2024         修改系统时间 2024年4月27日

在这里插入图片描述

执行kubectl 命令可以看到提示证书过期

在这里插入图片描述

step1 使用kubeadm alpha certs renew all 更新证书

使用 kubeadm alpha certs renew all 可以更新所有组件证书

kubeadm alpha certs renew all 

在这里插入图片描述

执行kubectl get nodes 访问成功

在这里插入图片描述

所以 kubeadm alpha certs renew all执行完成后 已经替换了 /root/.kube/config 文件中的证书 进入查看 确实已经自动更新了 (如果没有更新需要手动将admin.conf 替换 config

cat /root/.kube/config

在这里插入图片描述

echo LS0tLS1CRUdJ省略   | base64 -d > c.crt
cfssl certinfo -cert c.crt

证书时间确实更新了1年

在这里插入图片描述

关于cfssl的使用可以参考 《使用cfssl为程序添加https证书》

此时执行部署一个nginx pods 发现无法部署

在这里插入图片描述

step2 重启组件

上一步中可以看到kubectl 命令(查询操作)可以使用了,但是部署一个pod确失败了(没有任何响应)!

原因如下:
kubeadm alpha certs renew all命令更新了客户端证书即/root/.kube/config中的证书
访问k8s-apiserver(查询操作)可以通过验证(因为根证书没有变,客户端证书可以通过验证)
但是k8s组件还未重启,内部调用使用的证书还是老证书,所以需要重启k8s组件

关于 /root/.kube/config可以参考 《快速上手k8s权限管理 立即掌握User Role RoleBinding kubeconfig 实战教程》

进入master节点的 /etc/kubernetes/manifests/ 文件夹 稍微修改一下所有组件的配置文件,(配置文件修改后会自动重启组件

在这里插入图片描述

例如修改下timeoutSeconds

在这里插入图片描述

然后再重启所有节点的 kubelet.service

systemctl restart kubelet.service
journalctl -fu kubelet

重启后发现kubelet 客户端证书过期

1518 bootstrap.go:265] part of the existing bootstrap client certificate is expired: 2024-02-23 08:13:25 +0000 UTC
1518 server.go:273] failed to run Kubelet: unable to load bootstrap kubeconfig: stat /etc/kubernetes/bootstrap-kubelet.conf: no such file or directory

在这里插入图片描述

查看api-server日志也可以看到TLS 握手失败

在这里插入图片描述

I0427 00:51:31.877435       1 log.go:172] http: TLS handshake error from 192.168.0.124:56108: EOF
I0427 00:52:22.075177       1 log.go:172] http: TLS handshake error from 192.168.0.124:42214: EOF
I0427 00:53:45.493054       1 log.go:172] http: TLS handshake error from 192.168.0.160:35706: EOF

在这里插入图片描述

进入各个节点的 /var/lib/kubelet/pki文件夹 查看kubelet的证书 发现还是老证书 由此可以证明 kubeadm alpha certs renew all命令不会更新kubelet证书

在这里插入图片描述

所以此时k8s集群还是不可用状态

这里可以使用admin.conf中的证书信息替换 所有节点的中kubelet.conf 证书信息

即admin.conf中的client-certificate-data 与 client-key-data  
替换kubelet.conf  client-certificate 与 client-key

在这里插入图片描述

kubelet.conf 原始配置

在这里插入图片描述

kubelet.conf 替换后

在这里插入图片描述

所有节点替换完成后 可以看到 /var/lib/kubelet/pki 文件夹下生成了新的kubelet-client证书

在这里插入图片描述

此时再恢复kubelet.conf 中的原始配置即可 (不恢复也可以正常使用)

step3 测试使用k8s集群

注意由于改了本地时间所以 使用docker pull 镜像时会出现证书过期 (这个证书和k8s证书无关)

Error response from daemon: Get https://registry-1.docker.io/v2/: x509: certificate has expired or is not yet valid

在这里插入图片描述

所以要测试k8s集群是否正常使用只有使用节点本地存在的镜像

在这里插入图片描述

创建一个dp.yaml 部署文件 内容如下

在这里插入图片描述

注意:imagePullPolicy: Never 镜像拉取策略使用Never 不拉取镜像使用本地镜像

测试部署Pod 访问接口成功

在这里插入图片描述

创建service

在这里插入图片描述

外网访问Pod 成功

在这里插入图片描述


本文转载自: https://blog.csdn.net/liuyij3430448/article/details/130406844
版权归原作者 寂寞的4角钱 所有, 如有侵权,请联系我们删除。

“k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式”的评论:

还没有评论