第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网络插件是否正常工作?

posted @   逆风飞翔的博客  阅读(53)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示