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
相关推荐
Brilliantee4042 小时前
docker迁移SOP
docker·容器·eureka
大盛供应链·卢生3 小时前
半导体行业发展的主要驱动力,到底是什么?
容器·新浪微博
川石课堂软件测试3 小时前
自动化测试|持续集成Git使用详解
git·python·jmeter·mysql·ci/cd·容器·kubernetes
探索云原生4 小时前
KServe 工作流程:从 InferenceService 到 vLLM 服务
docker·ai·云原生·kubernetes·go
剑锋所指,所向披靡!4 小时前
Docker基础
运维·docker·容器
clz13145215 小时前
Dify的Windows平台部署:从Docker安装到Dify运行
windows·docker·容器
colinu7 小时前
Docker 容器自启动策略说明与常用命令
运维·docker·容器
灯澜忆梦7 小时前
【docker】#3 | 数据卷挂载
运维·docker·容器
像风一样自由202015 小时前
52.Docker部署大模型应用从本地开发到服务化运行
运维·人工智能·docker·容器·大模型·智能体