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

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第1张图片

证书替换的整体流程如下

  • 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

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第2张图片

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

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

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第3张图片

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

在这里插入图片描述

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

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

kubeadm alpha certs renew all 

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第4张图片

执行kubectl get nodes 访问成功

在这里插入图片描述

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

cat /root/.kube/config

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第5张图片

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

证书时间确实更新了1年

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第6张图片

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

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

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第7张图片

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/ 文件夹 稍微修改一下所有组件的配置文件,(配置文件修改后会自动重启组件

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第8张图片

例如修改下timeoutSeconds

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第9张图片

然后再重启所有节点的 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

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第10张图片

查看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

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第11张图片

kubelet.conf 原始配置

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第12张图片

kubelet.conf 替换后

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第13张图片

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

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第14张图片

此时再恢复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集群是否正常使用只有使用节点本地存在的镜像

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第15张图片

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

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第16张图片

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

测试部署Pod 访问接口成功

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第17张图片

创建service

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第18张图片

外网访问Pod 成功

k8s- kubernetes证书过期替换之kubeadm命令 certs renew all方式_第19张图片

你可能感兴趣的:(docker+k8s,kubernetes,docker,容器)