K8s集群升级与etcd备份恢复实战

Kubernetes 备份与恢复(etcd)

etcd 3.6 将备份与恢复功能拆分:etcdctl 负责在线备份,etcdutl 负责恢复。

一、准备 etcdctl 和 etcdutl 二进制

从 etcd 镜像中提取:

复制代码
# 创建临时容器
docker create --name demo reg.westos.org/k8s/etcd:3.6.6-0

# 从容器拷贝二进制到本机
docker cp demo:/usr/local/bin/etcdctl /usr/local/bin
docker cp demo:/usr/local/bin/etcdutl /usr/local/bin

# 拷贝到 master 节点
scp /usr/local/bin/etcdctl k8s-master:/usr/local/bin/
scp /usr/local/bin/etcdutl k8s-master:/usr/local/bin/

二、备份 etcd

在 master 节点执行:

复制代码
mkdir -p /backup/etcd

ETCDCTL_API=3 etcdctl \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/apiserver-etcd-client.crt \
  --key=/etc/kubernetes/pki/apiserver-etcd-client.key \
  --endpoints https://127.0.0.1:2379 \
  snapshot save /backup/etcd/etcd-$(date +%Y-%m-%d-%H-%M-%S).bak

三、查看快照状态

复制代码
ETCDCTL_API=3 etcdutl snapshot status --write-out=table \
  /backup/etcd/etcd-2026-09-27-11-26-04.bak

四、模拟故障(删除资源)

复制代码
kubectl delete deployments.apps nginx-server

五、恢复 etcd

1. 停止所有核心组件

复制代码
cd /etc/kubernetes/manifests/
mv * /mnt/          # 移走静态 Pod 清单,对应容器自动停止

2. 备份原数据目录

复制代码
mv /var/lib/etcd /mnt/

3. 从快照恢复

复制代码
ETCDCTL_API=3 etcdutl snapshot restore \
  --data-dir /var/lib/etcd \
  /backup/etcd/etcd-2026-09-27-11-26-04.bak

4. 重启所有组件

复制代码
mv /mnt/*.yaml /etc/kubernetes/manifests/    # 移回清单,容器自动启动

六、验证恢复

复制代码
kubectl get deployments.apps nginx-server
# NAME           READY   UP-TO-DATE   AVAILABLE   AGE
# nginx-server   3/3     3            3           4h53m

kubectl get pod -l app=nginx
# 三个 Pod 均 Running,说明资源已恢复

Kubernetes 集群升级

本实验:Kubernetes v1.35.8 → v1.36.5

升级方式:kubeadm

官方文档:

升级 kubeadm 集群 | Kubernetes

版本偏差策略:

版本偏差策略 | Kubernetes


修改各节点的 Kubernetes 安装源

复制代码
# vim /etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.36/rpm/
enabled=1
gpgcheck=0

# yum makecache fast

升级 Kubernetes Master 节点

升级 kubeadm

复制代码
# yum install -y kubeadm
# kubeadm version

确认版本为:

复制代码
v1.36.5

提前下载 K8s 升级镜像

复制代码
# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers

查看 v1.36.5 所需镜像:

复制代码
# kubeadm config images list --kubernetes-version v1.36.5

然后根据实验环境,将镜像上传到 Harbor:

复制代码
reg.westos.org

修改 containerd 配置

复制代码
# vim /etc/containerd/config.toml

修改:

复制代码
sandbox_image = "reg.westos.org/k8s/pause:3.10.2"

重启:

复制代码
# systemctl restart containerd.service

验证升级计划

复制代码
# kubeadm upgrade plan

执行升级

复制代码
# kubeadm upgrade apply v1.36.5

等待升级完成。


升级 kubelet 和 kubectl

复制代码
# yum install -y kubelet kubectl

重启 kubelet:

复制代码
# systemctl daemon-reload
# systemctl restart kubelet

解除节点保护

复制代码
# kubectl uncordon k8s1

验证

复制代码
# kubectl get node

例如:

复制代码
NAME   STATUS   ROLES           VERSION
k8s1   Ready    control-plane   v1.36.5
k8s2   Ready    worker          v1.35.8
k8s3   Ready    worker          v1.35.8

升级工作节点

工作节点需要逐个升级。

修改 containerd

复制代码
# vim /etc/containerd/config.toml

sandbox_image = "reg.westos.org/k8s/pause:3.10.1"

# systemctl restart containerd.service

升级 kubeadm

复制代码
# yum install -y kubeadm
# kubeadm version

确认:

复制代码
v1.36.5

执行升级

复制代码
# kubeadm upgrade node

腾空节点

在 Master 节点执行:

复制代码
# kubectl drain k8s2 --ignore-daemonsets

如果提示 emptyDir:

复制代码
# kubectl drain k8s2 --ignore-daemonsets --delete-emptydir-data

升级 kubelet 和 kubectl

在 k8s2 上:

复制代码
# yum install -y kubelet kubectl

重启:

复制代码
# systemctl daemon-reload
# systemctl restart kubelet

解除节点保护

在 Master 节点执行:

复制代码
# kubectl uncordon k8s2

其他工作节点

k8s3 按照相同步骤操作:

复制代码
# kubectl drain k8s3 --ignore-daemonsets

在 k8s3:

复制代码
# yum install -y kubeadm
# kubeadm upgrade node
# yum install -y kubelet kubectl
# systemctl daemon-reload
# systemctl restart kubelet

回到 Master:

复制代码
# kubectl uncordon k8s3

最后验证集群

复制代码
# kubectl get node

最终:

复制代码
NAME   STATUS   ROLES           VERSION
k8s1   Ready    control-plane   v1.36.5
k8s2   Ready    worker          v1.36.5
k8s3   Ready    worker          v1.36.5

再检查 Pod:

复制代码
# kubectl get pod -A

确保没有:

复制代码
Pending
CrashLoopBackOff
ImagePullBackOff
ErrImagePull
相关推荐
无言听风雨丶7 小时前
Kubernetes 控制平面深度剖析:从 kubectl apply 到 etcd 写入的全链路
平面·kubernetes·etcd
openFuyao8 小时前
openFuyao x 复旦大学软件工程实验室 Panel 回顾:Agentic时代,集群调度技术体系将如何演进?
kubernetes·openfuyao
螺蛳粉 螺蛳粉9 小时前
第 05 篇:etcd 深入:Raft 共识、watch 机制与快照备份恢复实战(底座认知 05)
docker·云原生·容器·kubernetes·etcd·分布式存储·kube-apiserver
相思难忘成疾12 小时前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes
PellyKoo12 小时前
【docker】cifs卷改smb密码后容器起不来的解决方法
运维·docker·容器
weirong13 小时前
给 K8s 加一个自动值班员:分级故障自愈引擎
kubernetes
云和数据.ChenGuang13 小时前
Python 闭包详解:从原理到实战
linux·开发语言·人工智能·python·kubernetes
阿标在干嘛13 小时前
容器编排的“场景适配”:我们为什么在部分服务中回归了Docker Compose?
运维·docker·容器
IT199516 小时前
Docker 快速部署 DM8 达梦数据库|完整踩坑笔记
笔记·docker·容器
Star(up up up)17 小时前
Docker系列---Docker容器基本命令(新手小白保姆级实操教程)
运维·学习·程序人生·青少年编程·docker·容器·dubbo