云原生运维实战 | 快速解决高可用K8s集群证书到期问题

欢迎关注「全栈工程师修炼指南」公众号

设为星标⭐每天带你 基础入门 到 进阶实践 再到 放弃学习

专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享

  花开堪折直须折,莫待无花空折枝 


作者主页:[ https://www.weiyigeek.top ]  

博客:[ https://blog.weiyigeek.top ]

作者<安全开发运维>答疑交流群,回复【学习交流群】即可加入


测试环境K8S集群节点信息:

kubectl get node
NAME                 STATUS   ROLES                  AGE    VERSION
devtest-master-212   Ready    control-plane,master   379d   v1.23.7
devtest-master-213   Ready    control-plane,master   379d   v1.23.7
devtest-master-214   Ready    control-plane,master   379d   v1.23.7
devtest-work-215     Ready    work                   379d   v1.23.7

0x00 Master 控制平面节点证书更新流程

Step 1. 在生产服务器上任何时候都要先备份再操作(非常重要)

mkdir ~/.backup/
cp -a /etc/kubernetes  ~/.backup/
cp -a /var/lib/kubelet/pki  ~/.backup/

Step 2.Kubernetes 集群证书过期错误提示信息:

$ kubectl get pod
Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2023-06-29T14:47:26+08:00 is after 2023-06-15T05:08:19Z

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.7", GitCommit:"42c05a547468804b2053ecf60a3bd15560362fc2", GitTreeState:"clean", BuildDate:"2022-05-24T12:30:55Z", GoVersion:"go1.17.10", Compiler:"gc", Platform:"linux/amd64"}

Step 3.检查节点证书过期时间(在所有控制平面[Master]节点执行)

# 正式版本
kubeadm certs check-expiration
# alpha 版本
kubeadm alpha certs check-expiration

## 如下所示证书于 2023 年 6 月 15 日到期,当前时间 2023年6月29日 16:36:39
# CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
# admin.conf                 Jun 15, 2023 05:05 UTC   <invalid>       ca                      no
# apiserver                  Jun 15, 2023 05:05 UTC   <invalid>       ca                      no
# apiserver-etcd-client      Jun 15, 2023 05:05 UTC   <invalid>       etcd-ca                 no
# apiserver-kubelet-client   Jun 15, 2023 05:05 UTC   <invalid>       ca                      no
# controller-manager.conf    Jun 15, 2023 05:05 UTC   <invalid>       ca                      no
# etcd-healthcheck-client    Jun 15, 2023 05:05 UTC   <invalid>       etcd-ca                 no
# etcd-peer                  Jun 15, 2023 05:05 UTC   <invalid>       etcd-ca                 no
# etcd-server                Jun 15, 2023 05:05 UTC   <invalid>       etcd-ca                 no
# front-proxy-client         Jun 15, 2023 05:05 UTC   <invalid>       front-proxy-ca          no
# scheduler.conf             Jun 15, 2023 05:05 UTC   <invalid>       ca                      no

# CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
# ca                      Jun 12, 2032 04:54 UTC   8y              no
# etcd-ca                 Jun 12, 2032 04:54 UTC   8y              no
# front-proxy-ca          Jun 12, 2032 04:54 UTC   8y              no

Step 4.更新节点证书(在所有控制平面[Master]节点执行)

# 正式版本
kubeadm certs renew all

# alpha 版本
kubeadm alpha certs renew all

# 关键点: 此处由于我们是部署在k8s集群中使用daemonsets.apps控制进行运行在各master节点上
Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.

Step 5.由于动态证书重载目前还不被所有组件支持,所以重启各控制平面 daemonsets.apps 管理的pod即kube-apiserver, kube-controller-manager, kube-scheduler and etcd。(在所有控制平面[Master]节点执行)
注意: 上述静态 Pods 是被本地 kubelet 而不是 API Server 管理, 所以 kubectl 不能用来删除或重启他们,只能临时将清单文件从 /etc/kubernetes/manifests/ 移除并等待 20 秒(参考 KubeletConfiguration 结构 中的fileCheckFrequency 值), 等待pod终止后再将配置清单移会原始目录,然后kubelet将会重建这些Pod。

# 备份文件,移除 daemonsets.apps 资源配置清单
mkdir /tmp/k8s
mv /etc/kubernetes/manifests/*yaml /tmp/k8s

# 检查节点上 pod 运行情况,等待上述 Pod 全部终止
crictl ps

# 将配置清单移会原始目录
mv //tmp/k8s/*yaml  /etc/kubernetes/manifests

# 等待20秒后再次查看Pod是否运行
crictl ps | grep "devtest-master-213"
# 或者通过 
kubectl get pod -n kube-system | grep 214

Step 6.更新kubectl使用的配置文件 (在所有控制平面[Master]节点执行,其他master节点可选)

# 重新生成 /etc/kubenetes 目录下的 conf 文件 (主节点执行一次即可)
# kubeadm init --kubernetes-version=v1.23.7 phase kubeconfig all

cp -a /etc/kubernetes/admin.conf ~/.kube/config

Step 7.重启控制节点上的 kubelet 服务。

# 重启服务
systemctl restart kubelet

# 查看 kubelet-client-current.pem 、kubelet-server-current.pem 证书文件起始时间是否改变
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text | grep Not
openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -noout -text | grep Not

Step 8.若kuebelt证书未更新,我们需要在集群证书签名请求CSR中进行批准。

# 查看节点的CSR请求
kubectl get csr | grep "213"
  # csr-q4kz8   30m    kubernetes.io/kubelet-serving         system:node:devtest-master-213   <none>   Approved,Issued

# 批准节点的CSR请求
kubectl certificate approve csr-q4kz8 
  # csr-q4kz8   30m    kubernetes.io/kubelet-serving         system:node:devtest-master-213   <none>   Pendding

$ ls -alh
-rw------- 1 root root 2.8K Jun 29 15:10 kubelet-client-2023-06-29-15-10-08.pem
lrwxrwxrwx 1 root root   59 Jun 29 15:10 kubelet-client-current.pem -> /var/lib/kubelet/pki/kubelet-client-2023-06-29-15-10-08.pem
-rw-r--r-- 1 root root 2.3K Jun 15  2022 kubelet.crt
-rw------- 1 root root 1.7K Jun 15  2022 kubelet.key
-rw------- 1 root root 1.2K Jun 29 15:26 kubelet-server-2023-06-29-15-26-42.pem
lrwxrwxrwx 1 root root   59 Jun 29 15:26 kubelet-server-current.pem -> /var/lib/kubelet/pki/kubelet-server-2023-06-29-15-26-42.pem

step 9.至此完毕,九九归一。



0x02 Work 工作节点证书更新流程

# 1.在 Master 节点上生成对应work节点 kubelet.conf 配置到共享目录中
devtest-master-213 $ kubeadm init --kubernetes-version=v1.23.7 phase kubeconfig kubelet --node-name devtest-work-215 --kubeconfig-dir /mnt/nfs
[kubeconfig] Writing "kubelet.conf" kubeconfig file

# 2.在对应的 Work 节点上将生成 kubelet.conf 复制 到 /etc/kubernetes/kubelet.conf 目录中
devtest-work-215 $ cp /mnt/nfs/kubelet.conf /etc/kubernetes/kubelet.conf

# 3.然后重启工作节点上 kubelet 服务
devtest-work-215 $ systemctl restart kubelet

# 4.在master节点上批准该节点的CSR请求
kubectl get csr | grep "215"
kubectl certificate approve csr-q28z8 

# 5.验证 kubelet 客户端以及服务端证书是否更新, 如果有多台worker的话,使用类似的方法操作。
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text  |grep Not
    Not Before: Jun 29 08:10:39 2023 GMT
    Not After : Jun 28 08:10:39 2024 GMT
openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -noout -text  |grep Not
    Not Before: Jun 29 08:01:19 2023 GMT
    Not After : Jun 28 08:01:19 2024 GMT

知识扩展,如果 /var/lib/kubelet/pki/kubelet-client-current.pem 软连接不更新解决办法如下:

# 移除旧的证书链接文件
mv /var/lib/kubelet/pki/kubelet-client-2* /tmp/k8s
mv /var/lib/kubelet/pki/kubelet-server-2* /tmp/k8s

# 重启节点上的 kubelet
systemctl restart kubelet

# 在 master 节点上批转CSR请求
kubectl certificate approve csr-q8as1

亲,文章就要看完了,不关注一下【全栈工程师修炼指南】吗?​​​​​​​


0x02 测试集群部署情况
Step 1.在master上创建pod1.yaml内容如下。

tee pod1.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    blog: weiyigeek.top
  name: pod1
spec:
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: pod1
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
EOF

Step 2.在集群中创建此pod,并查看该POD运行状态。

kubectl apply -f pod1.yaml
kubectl get pod pod1 -o wide

9b93edb2d99ea2a4008ebe5f6ba50fa9.png


本文至此完毕,更多技术文章,尽情等待下篇好文!

原文地址: https://blog.weiyigeek.top/

如果此篇文章对你有帮助,请你将它分享给更多的人! 

a9c3799d8c368c8eb85acc8a1ab66987.gif

61243b24cfe5e6a698efb818b3943c51.png 学习书籍推荐 往期发布文章 2d65be42f91bb44b42213809021e4849.png

公众号回复【0008】获取【Ubuntu22.04安装与加固脚本】

公众号回复【10001】获取【WinServer安全加固脚本】

公众号回复【10002】获取【KylinOS银河麒麟安全加固脚本】

公众号回复【0011】获取【k8S二进制安装部署教程】

公众号回复【0014】获取【Nginx学习之路汇总】

公众号回复【0015】获取【Jenkins学习之路汇总】

 热文推荐  

欢迎长按(扫描)二维码 取更多渠道哟!

欢迎关注 【全栈工程师修炼指南】(^U^)ノ~YO

添加作者微信【weiyigeeker】,拉你一起学习交流吧!

关注回复【学习交流群】即可加入【安全开发运维沟通交流群

温馨提示: 由于作者水平有限,本章错漏缺点在所难免,希望读者批评指正,若有问题或建议请在文章末尾留下您宝贵的经验知识,或联系邮箱地址 master@weiyigeek.top 或 关注公众号 [全栈工程师修炼指南] 留言。

朋友点个【赞 + 在看】吧!

点击【"阅读原文"】获取更多有趣的知识!   

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值