赞
踩
欢迎关注「全栈工程师修炼指南」公众号
设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习!
专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享
“ 花开堪折直须折,莫待无花空折枝。 ”
作者主页:[ 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
本文至此完毕,更多技术文章,尽情等待下篇好文!
原文地址: https://blog.weiyigeek.top/
如果此篇文章对你有帮助,请你将它分享给更多的人!
学习书籍推荐 往期发布文章
公众号回复【0008】获取【Ubuntu22.04安装与加固脚本】
公众号回复【10001】获取【WinServer安全加固脚本】
公众号回复【10002】获取【KylinOS银河麒麟安全加固脚本】
公众号回复【0011】获取【k8S二进制安装部署教程】
公众号回复【0014】获取【Nginx学习之路汇总】
公众号回复【0015】获取【Jenkins学习之路汇总】
热文推荐
还不会部署高可用的kubernetes集群?企业DevOps实践之使用kubeadm方式安装高可用k8s集群v1.23.7
企业运维实践-如何在K8S集群环境Gitlab+Jenkins+Jmeter+Grafana技术中实现自动化分布压力测试数据展示
欢迎长按(扫描)二维码 ,获取更多渠道哟!
欢迎关注 【全栈工程师修炼指南】(^U^)ノ~YO
添加作者微信【weiyigeeker】,拉你一起学习交流吧!
关注回复【学习交流群】即可加入【安全开发运维沟通交流群】
温馨提示: 由于作者水平有限,本章错漏缺点在所难免,希望读者批评指正,若有问题或建议请在文章末尾留下您宝贵的经验知识,或联系邮箱地址 master@weiyigeek.top 或 关注公众号 [全栈工程师修炼指南] 留言。
朋友点个【赞 + 在看】吧!
点击【"阅读原文"】获取更多有趣的知识!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。