当前位置: 首页 > news >正文

K8s 集群(kubeadm) CA 证书过期解决方案

k8s-adm

Author:Arsen
Date:2024/07/04


目录

    • 一、现象描述
    • 二、解决方案
    • 三、集群验证


一、现象描述

之前有篇文章《K8s Token 过期解决方案(Kubeadm)》提到了默认生成的 Token 有效期只有 24 小时,过期后 Token 将不可用,如果想新的 Node 节点加入 K8s 集群,则需重新生成新的 Token。

今天无意间打开我虚拟机部署的 K8s 集群(通过 kubeadm 方式部署),发现 CA 证书过期了(如下图):

kubectl get pods

image-20240704153715854

于是查看我的 K8s 集群证书,显示证书都过期了(如下图):

# 查看证书过期时间 => k8s1.15+版本的查看方法
kubeadm certs check-expiration

image-20240704142609767

字段说明:

字段解释
CERTIFICATE证书的名称
EXPIRES证书过期的时间点
RESIDUAL TIME当前时间距离证书过期的剩余时间
CERTIFICATE AUTHORITY证书的颁发机构
EXTERNALLY MANAGED证书是否由外部系统管理

证书字段详解:

CERTIFICATEEXPIRESRESIDUAL TIMECERTIFICATE AUTHORITYEXTERNALLY MANAGED备注
admin.confDec 12, 2023 03:36 UTCcanoKubeconfig 文件,包含集群访问的配置
apiserverDec 12, 2023 03:36 UTCcanoKubernetes API 服务器的证书
apiserver-etcd-clientDec 12, 2023 03:36 UTCetcd-canoAPI 服务器与 ETCD 之间的客户端证书
apiserver-kubelet-clientDec 12, 2023 03:36 UTCcanoAPI 服务器与 Kubelet 之间的客户端证书
controller-manager.confDec 12, 2023 03:36 UTCcanoKubernetes 控制器管理器的 Kubeconfig 文件
etcd-healthcheck-clientDec 12, 2023 03:36 UTCetcd-cano用于 ETCD 健康检查的客户端证书
etcd-peerDec 12, 2023 03:36 UTCetcd-canoETCD 节点间的对等通信证书
etcd-serverDec 12, 2023 03:36 UTCetcd-canoETCD 服务器的证书
front-proxy-clientDec 12, 2023 03:36 UTCfront-proxy-cano前端代理的客户端证书
scheduler.confDec 12, 2023 03:36 UTCcanoKubernetes 调度器的 Kubeconfig 文件

显然,上表中的这些证书在 2023 年 12 月 12 日 03:36 UTC 就已经过期,且剩余时间为<invalid>,表示这些证书已过期(无效),需要重新生成。

证书颁发机构字段解释:

CERTIFICATE AUTHORITYEXPIRESRESIDUAL TIMEEXTERNALLY MANAGED备注
caDec 09, 2032 03:36 UTC8年noKubernetes 的主证书颁发机构
etcd-caDec 09, 2032 03:36 UTC8年noETCD 的证书颁发机构
front-proxy-caDec 09, 2032 03:36 UTC8年no前端代理的证书颁发机构

二、解决方案

1、对过期证书进行备份,并删除旧的证书

# 备份证书
cp -rp /etc/kubernetes /etc/kubernetes.bak# 删除旧的证书(使用新版本的新命令生成证书时可以忽略这一步,即可以不用删除)
# rm -f /etc/kubernetes/pki/apiserver*
# rm -f /etc/kubernetes/pki/front-proxy-client.*
# rm -rf /etc/kubernetes/pki/etcd/healthcheck-client.*
# rm -rf /etc/kubernetes/pki/etcd/server.*
# rm -rf /etc/kubernetes/pki/etcd/peer.*

2、重新生成证书

# 新版本(1.15+) - - 使用该命令不用提前删除过期证书
kubeadm certs renew all# 老版本
# kubeadm alpha certs renew all

image-20240704144738457

3、备份旧的配置文件,并重新生成新的配置文件

mv /etc/kubernetes/*.conf /tmp/# 新版本(1.15+)
kubeadm init phase kubeconfig all# 老版本
# kubeadm alpha phase kubeconfig all

image-20240704144929550

4、更新 kubectl 配置

# 备份配置文件
cp -rp ~/.kube/config ~/.kube/config.bak# 更新配置文件
\cp /etc/kubernetes/admin.conf ~/.kube/config# 修改权限
chown $(id -u):$(id -g) $HOME/.kube/config

5、证书过期时间确认

# 新版本(1.15+)查看方法
kubeadm certs check-expiration# 单独查看(其他同理)
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep 'Not'# 老版本查看方法
# kubeadm alpha certs check-expiration

image-20240704155002524

CA 证书时间已经更新,

6、重启 kubelet

所有 work 节点执行,如果你的 master 节点也作为 work 节点使用,那 master 节点也需要执行重启 kubelet 的操作。

systemctl restart kubelet
systemctl status kubelet

7、查看集群节点状态

image-20240704213044612

发现 work 节点不健康,这个时候我们需要重新将work 节点加入 k8s 集群

1)先查看集群中是否有 Token

kubeadm token list

image-20240704213334228

2)没有则重新生成 Token

# 生成默认 24 小时 Token(推荐)
kubeadm token create# 生成永久有效 Token
# kubeadm token create --ttl 0

image-20240704213514382

3)获取 CA 证书 Hash 值

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

image-20240704213606235

4)最后就是 work 节点加入 K8s 集群

以 work1 节点为例,work2 节点及其他 work 节点同理。

# 填入上图生成的 token、hash 值,并加入集群。
kubeadm join 192.168.56.160:6443 --token zlj5j5.3ezp1s8drj3jgept --discovery-token-ca-cert-hash sha256:3ed701329742f7549f73cb065a8677abe8b5b8a3e25bbca7bb26f317ffcf89d4

执行后报错:

image-20240704214147260

报错原因:这些文件为旧文件(过期的文件),我们备份后清理即可

# 备份
cp -a /etc/kubernetes/kubelet.conf /tmp/kubelet.conf.back
cp -a /etc/kubernetes/pki/ca.crt /tmp/ca.crt.back# 清理
rm -f /etc/kubernetes/kubelet.conf
rm -f /etc/kubernetes/pki/ca.crt

清理完成后,再次将 work 节点加入集群:

kubeadm join 192.168.56.160:6443 --token zlj5j5.3ezp1s8drj3jgept --discovery-token-ca-cert-hash sha256:3ed701329742f7549f73cb065a8677abe8b5b8a3e25bbca7bb26f317ffcf89d4

image-20240704214527787

8、查看 k8s 集群节点健康状态

kubectl get nodes

image-20240704214840263

9、最后再验证以下证书过期时间

kubeadm certs check-expiration

image-20240704215014780

无误后,K8s 集群的 CA 证书更新完毕,此时打一个快照(因为我是虚拟机),方便后续实验所用。

三、集群验证

K8s 集群证书过期时间更新完毕后,且集群节点也是健康的状态,那接下来我们跑一个测试服务验证一下集群是否可用。

kubectl create deployment nginx --image=nginx   # 创建单副本作为测试即可
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

image-20240704215819509

image-20240704215754156

浏览器访问验证:http://192.168.56.160:31122/

image-20240704215918255

再看看 pod 所在 work 节点:调度也是没问题的。

image-20240704220030579

至此,K8s 集群验证完毕!

—END

相关文章:

  • 【代码随想录_Day24】134. 加油站 135. 分发糖果 860. 柠檬水找零 406. 根据身高重建队列
  • 地理信息科学:生态保护的智慧经纬
  • 2024年 Java 面试八股文(20w字)
  • springcloud第4季 分布式事务seata作用服务搭建1
  • Linux上快速定位Java代码问题行
  • 云桌面运维工程师
  • 大数据------JavaWeb------JSP(完整知识点汇总)
  • Spring Boot中的安全漏洞防护
  • Django靓号管理系统:实现用户列表功能
  • react 重新加载子组件
  • 目标检测入门:3.目标检测损失函数(IOU、GIOU、GIOU)
  • 【ubuntu】切换shell并显示git分支名字
  • Python学习笔记28:进阶篇(十七)常见标准库使用之质量控制中的代码质量与风格第二部分
  • 笔记-linux写文件的方法
  • 【FFmpeg】avcodec_open2函数
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • github指令
  • httpie使用详解
  • JavaScript设计模式之工厂模式
  • java正则表式的使用
  • Node 版本管理
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Promise面试题2实现异步串行执行
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • 动态魔术使用DBMS_SQL
  • 给初学者:JavaScript 中数组操作注意点
  • 后端_ThinkPHP5
  • 计算机常识 - 收藏集 - 掘金
  • 模型微调
  • 前端路由实现-history
  • 山寨一个 Promise
  • 推荐一个React的管理后台框架
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 阿里云服务器如何修改远程端口?
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #{}和${}的区别?
  • #LLM入门|Prompt#3.3_存储_Memory
  • #Ubuntu(修改root信息)
  • #window11设置系统变量#
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • ${ }的特别功能
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (ibm)Java 语言的 XPath API
  • (Note)C++中的继承方式
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)jQuery 基础
  • (转载)Google Chrome调试JS
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • /usr/bin/env: node: No such file or directory