欢迎关注「全栈工程师修炼指南」公众号
设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习!
专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享
“ 花开堪折直须折,莫待无花空折枝。 ”
作者主页:[ 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 allcp -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 NotNot Before: Jun 29 08:10:39 2023 GMTNot After : Jun 28 08:10:39 2024 GMT
openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -noout -text |grep NotNot Before: Jun 29 08:01:19 2023 GMTNot 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: nulllabels:blog: weiyigeek.topname: pod1
spec:containers:- image: nginximagePullPolicy: IfNotPresentname: pod1resources: {}dnsPolicy: ClusterFirstrestartPolicy: 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技术中实现自动化分布压力测试数据展示
运维实践 | 使用K3S之快速搭建精简版本K8S集群环境,助力开发测试环境!
记一次由于外部K8S集群证书到期导致Jenkins无法生成动态agent节点错误解决(入坑出坑)
欢迎长按(扫描)二维码 ,获取更多渠道哟!
欢迎关注 【全栈工程师修炼指南】(^U^)ノ~YO
添加作者微信【weiyigeeker】,拉你一起学习交流吧!
关注回复【学习交流群】即可加入【安全开发运维沟通交流群】
温馨提示: 由于作者水平有限,本章错漏缺点在所难免,希望读者批评指正,若有问题或建议请在文章末尾留下您宝贵的经验知识,或联系邮箱地址 master@weiyigeek.top 或 关注公众号 [全栈工程师修炼指南] 留言。
朋友点个【赞 + 在看】吧!
点击【"阅读原文"】获取更多有趣的知识!