第12章 Kubernetes集群维护
• Etcd数据库备份与恢复
• kubeadm对K8s集群进行版本升级
• K8s集群节点正确下线流程
• K8s集群故障排查思路
12.1Etcd数据库备份与恢复
Kubernetes使用etcd数据库实时存储集群中的数据,安全起见,已定义备份!
12.1.1 Kubeadm部署方式:
备份: ETCDCTL_API=3 etcdctl \ snapshot save snap.db \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key
12.1.2恢复
1、先暂停kube-apiserver和etcd容器 mv /etc/kubernetes/manifests /etc/kubernetes/manifests.bak mv /var/lib/etcd/ /var/lib/etcd.bak 2、恢复 ETCDCTL_API=3 etcdctl \ snapshot restore snap.db \ --data-dir=/var/lib/etcd 3、启动kube-apiserver和etcd容器 mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests
12.2 二进制部署方式
12.2.1备份
ETCDCTL_API=3 etcdctl \ snapshot save snap.db \ --endpoints=https://192.168.31.71:2379 \ --cacert=/opt/etcd/ssl/ca.pem \ --cert=/opt/etcd/ssl/server.pem \ --key=/opt/etcd/ssl/server-key.pem
12.2.2恢复
Kubernetes 集群备份主要是备份 ETCD 集群。而恢复时,主要考虑恢复整个顺序:
停止kube-apiserver --> 停止ETCD --> 恢复数据 --> 启动ETCD --> 启动kube-apiserve
特别注意:
- 备份ETCD集群时,只需要备份一个ETCD数据,然后同步到其他节点上。
- 恢复ETCD数据时,拿其中一个节点的备份数据恢复即可。
1、先暂停kube-apiserver和etcd systemctl stop kube-apiserver systemctl stop etcd mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak 2、在每个节点上恢复 ETCDCTL_API=3 etcdctl snapshot restore snap.db \ --name etcd-1 \ --initial-cluster="etcd-1=https://192.168.31.71:2380,etcd- 2=https://192.168.31.72:2380,etcd-3=https://192.168.31.73:2380" \ --initial-cluster-token=etcd-cluster \ --initial-advertise-peer-urls=https://192.168.31.71:2380 \ --data-dir=/var/lib/etcd/default.etcd 3、启动kube-apiserver和etcd systemctl start kube-apiserver systemctl start etcd
12.3 kubeadm对K8s集群进行版本升级
Kubernetes每隔3个月发布一个小版本。
升级策略:
• 始终保持最新
• 每半年升级一次,这样会落后社区1~2个小版本
• 一年升级一次,或者更长,落后版本太
12.3.1kubeadm对k8s集群进行版本流程
• 升级前必须备份所有组件及数据,例如etcd
• 千万不要跨多个小版本进行升级,例如从1.16升级到1.19
12.3.2升级管理节点
、查找最新版本号 yum list --showduplicates kubeadm --disableexcludes=kubernetes 2、升级kubeadm yum install -y kubeadm-1.21.0-0 --disableexcludes=kubernetes 3、驱逐node上的pod,且不可调度 kubectl drain k8s-master --ignore-daemonsets 4、检查集群是否可以升级,并获取可以升级的版本 kubeadm upgrade plan 5、执行升级 kubeadm upgrade apply v1.21.0 6、取消不可调度 kubectl uncordon k8s-master 7、升级kubelet和kubectl yum install -y kubelet-1.21.0-0 kubectl-1.21.0-0 --disableexcludes=kubernetes 8、重启kubelet systemctl daemon-reload systemctl restart kubelet
12.3.3 升级工作节点:
1、升级kubeadm yum install -y kubeadm-1.21.0-0 --disableexcludes=kubernetes 2、驱逐node上的pod,且不可调度 kubectl drain k8s-node1 --ignore-daemonsets 3、升级kubelet配置 kubeadm upgrade node 4、升级kubelet和kubectl yum install -y kubelet-1.21.0-0 kubectl-1.21.0-0 --disableexcludes=kubernetes 5、重启kubelet systemctl daemon-reload systemctl restart kubelet 6、取消不可调度,节点重新上线 kubectl uncordon k8s-node1
12.4 K8s集群节点正确下线流程
如果你想维护某个节点或者删除节点,正确流程如下:
1、获取节点列表
kubectl get node
2、驱逐节点上的Pod并设置不可调度(cordon)
kubectl drain <node_name> --ignore-daemonsets #如果你想要确保驱逐期间的 Pod 可以重新调度回来,可以添加 --ignore-daemonsets
参数。
3、设置可调度或者移除节点
kubectl uncordon <node_name>
kubectl delete node <node_name>
12.5K8s集群故障排查:应用部署
kubectl describe TYPE/NAME kubectl logs TYPE/NAME [-c CONTAINER] kubectl exec POD [-c CONTAINER] -- COMMAND [args...]
12.6组件不能正常工作
管理节点组件: • kube-apiserver • kube-controller-manager • kube-scheduler 工作节点组件: • kubelet • kube-proxy
需要先区分部署方式:
1、kubeadm
除kubelet外,其他组件均采用静态Pod启动
2、二进制
所有组件均采用systemd管理
常见问题:
• 网络不通
• 启动失败,一般配置文件或者依赖服务
• 平台不兼
12.7K8s集群故障排查:Service访问异常
Service一般是访问不通,有以下可能性:
1、Service是否关联Pod?
2、Service指定target-port端口是否正常?
3、Pod正常工作吗?
4、Service是否通过DNS工作?
5、kube-proxy正常工作吗?
6、kube-proxy是否正常写iptables规则?
7、cni网络插件是否正常工作?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!