当前位置:   article > 正文

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

k8s集群证书过期

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

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

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

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


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

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

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


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

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

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

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

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

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

  1. $ kubectl get pod
  2. 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
  3. $ kubectl version
  4. 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]节点执行)

  1. # 正式版本
  2. kubeadm certs check-expiration
  3. # alpha 版本
  4. kubeadm alpha certs check-expiration
  5. ## 如下所示证书于 2023615 日到期,当前时间 202362916:36:39
  6. # CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
  7. # admin.conf Jun 15, 2023 05:05 UTC <invalid> ca no
  8. # apiserver Jun 15, 2023 05:05 UTC <invalid> ca no
  9. # apiserver-etcd-client Jun 15, 2023 05:05 UTC <invalid> etcd-ca no
  10. # apiserver-kubelet-client Jun 15, 2023 05:05 UTC <invalid> ca no
  11. # controller-manager.conf Jun 15, 2023 05:05 UTC <invalid> ca no
  12. # etcd-healthcheck-client Jun 15, 2023 05:05 UTC <invalid> etcd-ca no
  13. # etcd-peer Jun 15, 2023 05:05 UTC <invalid> etcd-ca no
  14. # etcd-server Jun 15, 2023 05:05 UTC <invalid> etcd-ca no
  15. # front-proxy-client Jun 15, 2023 05:05 UTC <invalid> front-proxy-ca no
  16. # scheduler.conf Jun 15, 2023 05:05 UTC <invalid> ca no
  17. # CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
  18. # ca Jun 12, 2032 04:54 UTC 8y no
  19. # etcd-ca Jun 12, 2032 04:54 UTC 8y no
  20. # front-proxy-ca Jun 12, 2032 04:54 UTC 8y no

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

  1. # 正式版本
  2. kubeadm certs renew all
  3. # alpha 版本
  4. kubeadm alpha certs renew all
  5. # 关键点: 此处由于我们是部署在k8s集群中使用daemonsets.apps控制进行运行在各master节点上
  6. 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。

  1. # 备份文件,移除 daemonsets.apps 资源配置清单
  2. mkdir /tmp/k8s
  3. mv /etc/kubernetes/manifests/*yaml /tmp/k8s
  4. # 检查节点上 pod 运行情况,等待上述 Pod 全部终止
  5. crictl ps
  6. # 将配置清单移会原始目录
  7. mv //tmp/k8s/*yaml /etc/kubernetes/manifests
  8. # 等待20秒后再次查看Pod是否运行
  9. crictl ps | grep "devtest-master-213"
  10. # 或者通过
  11. kubectl get pod -n kube-system | grep 214

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

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

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

  1. # 重启服务
  2. systemctl restart kubelet
  3. # 查看 kubelet-client-current.pem 、kubelet-server-current.pem 证书文件起始时间是否改变
  4. openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text | grep Not
  5. openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -noout -text | grep Not

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

  1. # 查看节点的CSR请求
  2. kubectl get csr | grep "213"
  3. # csr-q4kz8 30m kubernetes.io/kubelet-serving system:node:devtest-master-213 <none> Approved,Issued
  4. # 批准节点的CSR请求
  5. kubectl certificate approve csr-q4kz8
  6. # csr-q4kz8 30m kubernetes.io/kubelet-serving system:node:devtest-master-213 <none> Pendding
  7. $ ls -alh
  8. -rw------- 1 root root 2.8K Jun 29 15:10 kubelet-client-2023-06-29-15-10-08.pem
  9. 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
  10. -rw-r--r-- 1 root root 2.3K Jun 15 2022 kubelet.crt
  11. -rw------- 1 root root 1.7K Jun 15 2022 kubelet.key
  12. -rw------- 1 root root 1.2K Jun 29 15:26 kubelet-server-2023-06-29-15-26-42.pem
  13. 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. # 1.在 Master 节点上生成对应work节点 kubelet.conf 配置到共享目录中
  2. devtest-master-213 $ kubeadm init --kubernetes-version=v1.23.7 phase kubeconfig kubelet --node-name devtest-work-215 --kubeconfig-dir /mnt/nfs
  3. [kubeconfig] Writing "kubelet.conf" kubeconfig file
  4. # 2.在对应的 Work 节点上将生成 kubelet.conf 复制 到 /etc/kubernetes/kubelet.conf 目录中
  5. devtest-work-215 $ cp /mnt/nfs/kubelet.conf /etc/kubernetes/kubelet.conf
  6. # 3.然后重启工作节点上 kubelet 服务
  7. devtest-work-215 $ systemctl restart kubelet
  8. # 4.在master节点上批准该节点的CSR请求
  9. kubectl get csr | grep "215"
  10. kubectl certificate approve csr-q28z8
  11. # 5.验证 kubelet 客户端以及服务端证书是否更新, 如果有多台worker的话,使用类似的方法操作。
  12. openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text |grep Not
  13. Not Before: Jun 29 08:10:39 2023 GMT
  14. Not After : Jun 28 08:10:39 2024 GMT
  15. openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -noout -text |grep Not
  16. Not Before: Jun 29 08:01:19 2023 GMT
  17. Not After : Jun 28 08:01:19 2024 GMT

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

  1. # 移除旧的证书链接文件
  2. mv /var/lib/kubelet/pki/kubelet-client-2* /tmp/k8s
  3. mv /var/lib/kubelet/pki/kubelet-server-2* /tmp/k8s
  4. # 重启节点上的 kubelet
  5. systemctl restart kubelet
  6. # 在 master 节点上批转CSR请求
  7. kubectl certificate approve csr-q8as1

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


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

  1. tee pod1.yaml <<'EOF'
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. creationTimestamp: null
  6. labels:
  7. blog: weiyigeek.top
  8. name: pod1
  9. spec:
  10. containers:
  11. - image: nginx
  12. imagePullPolicy: IfNotPresent
  13. name: pod1
  14. resources: {}
  15. dnsPolicy: ClusterFirst
  16. restartPolicy: Always
  17. status: {}
  18. EOF

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

  1. kubectl apply -f pod1.yaml
  2. 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 或 关注公众号 [全栈工程师修炼指南] 留言。

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/189882
推荐阅读
相关标签
  

闽ICP备14008679号