Kubernetes 运维实战:etcd 备份恢复、集群升级与证书更新

在 Kubernetes 集群的日常运维中,etcd 数据管理、版本升级和证书更新是确保集群稳定运行的三大核心任务。本文将基于实战经验,详细介绍这三项关键操作的具体步骤和注意事项。

一、etcd 备份与恢复操作

etcd 作为 Kubernetes 的数据存储核心,其数据安全性对集群至关重要。无论是单节点还是多节点集群,定期备份和掌握恢复演练都是必备的运维工作。

1.1 备份操作

单 master 集群备份

bash

运行

复制代码
ETCDCTL_API=3 etcdctl snapshot save /opt/etcd-back/snap.db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key

多 master 集群备份:需要在每个 master 节点执行备份命令:

bash

运行

复制代码
# 在 k8s-01 节点
ETCDCTL_API=3 etcdctl --endpoints="https://127.0.0.1:2379" \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key  \
snapshot save /snap-$(date +%Y%m%d%H%M).db

# 在 k8s-02 节点执行相同命令

备份完成后,建议将快照文件复制到安全的外部存储,并验证备份文件完整性:

bash

运行

复制代码
# 查看备份文件详情
etcdctl snapshot status snap.db -w table

1.2 恢复操作

单 master 集群恢复步骤

  1. 停止控制平面组件(通过移动静态 Pod 清单实现):

bash

运行

复制代码
mv /etc/kubernetes/manifests/ /etc/kubernetes/manifests-backup/
  1. 备份现有数据目录:

bash

运行

复制代码
mv /var/lib/etcd /var/lib/etcd.bak
  1. 从快照恢复数据:

bash

运行

复制代码
ETCDCTL_API=3 etcdctl --endpoints="https://127.0.0.1:2379"  \
--cert="/etc/kubernetes/pki/etcd/server.crt"  \
--key="/etc/kubernetes/pki/etcd/server.key"  \
--cacert="/etc/kubernetes/pki/etcd/ca.crt"   \
snapshot restore /opt/etcd-back/snap.db  --data-dir=/var/lib/etcd/
  1. 重启控制平面组件:

bash

运行

复制代码
mv /etc/kubernetes/manifests-backup /etc/kubernetes/manifests

多 master 集群恢复步骤

  1. 在所有 master 节点停止控制平面组件并备份数据目录(同单节点步骤 1-2)

  2. 分别在每个节点执行恢复命令(以两个节点为例):

bash

运行

复制代码
# 在 k8s-01 节点
ETCDCTL_API=3 etcdctl snapshot restore /snap-202207182330.db \
--name=k8s-01 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt  \
--cert=/etc/kubernetes/pki/etcd/peer.crt   \
--key=/etc/kubernetes/pki/etcd/peer.key   \
--initial-advertise-peer-urls=https://192.168.1.123:2380 \
--initial-cluster-token=etcd-cluster-0   \
--initial-cluster=k8s-01=https://192.168.1.123:2380,k8s-02=https://192.168.1.124:2380  \
--data-dir=/var/lib/etcd

# 在 k8s-02 节点执行类似命令,注意修改节点名称和地址
  1. 在所有 master 节点重启控制平面组件

二、Kubernetes 集群升级指南

集群升级需要遵循严格的步骤,确保升级过程中业务不受影响。以下是从 v1.28.15 升级到 v1.29.15 的示例流程。

2.1 升级前准备

  1. 检查集群状态,确保所有节点健康:

bash

运行

复制代码
kubectl get nodes
kubectl get pods --all-namespaces
  1. 备份重要数据:
  • etcd 数据备份(参考第一节)
  • 关键配置文件备份:/etc/kubernetes/ 目录
  1. 检查可升级版本:

bash

运行

复制代码
kubeadm upgrade plan

2.2 升级控制平面节点

  1. 验证升级计划差异:

bash

运行

复制代码
kubeadm upgrade diff 1.29.15
  1. 执行升级:

bash

运行

复制代码
kubeadm upgrade apply v1.29.15
  1. 升级 kubelet 和 kubectl:

bash

运行

复制代码
yum update -y kubelet
systemctl daemon-reload
systemctl restart kubelet

2.3 升级工作节点

  1. 标记节点不可调度:

bash

运行

复制代码
kubectl drain <node-name> --ignore-daemonsets
  1. 在工作节点执行升级:

bash

运行

复制代码
kubeadm upgrade node
yum update -y kubelet
systemctl daemon-reload
systemctl restart kubelet
  1. 恢复节点调度:

bash

运行

复制代码
kubectl uncordon <node-name>

2.4 升级验证

升级完成后,验证集群状态:

bash

运行

复制代码
kubectl get nodes  # 确认所有节点版本已更新且状态为 Ready
kubectl get pods --all-namespaces  # 确认所有系统组件正常运行

三、Kubernetes 证书更新流程

Kubernetes 证书默认有效期为 1 年,需要定期更新以避免集群故障。

3.1 使用 kubeadm 自动更新(推荐)

  1. 检查证书过期时间:

bash

运行

复制代码
kubeadm certs check-expiration
  1. 更新所有证书:

bash

运行

复制代码
sudo kubeadm certs renew all
  1. 验证更新结果:

bash

运行

复制代码
kubeadm certs check-expiration
  1. 重启控制平面组件:

bash

运行

复制代码
# 对于静态 Pod 管理的组件,删除 Pod 使其重建
kubectl delete pods -n kube-system kube-apiserver-<node-name>
kubectl delete pods -n kube-system kube-controller-manager-<node-name>
kubectl delete pods -n kube-system kube-scheduler-<node-name>

3.2 手动更新证书(非 kubeadm 部署)

  1. 检查证书过期时间:

bash

运行

复制代码
sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep "Not After"
  1. 生成新证书(以 apiserver 为例):

bash

运行

复制代码
openssl genrsa -out apiserver.key 2048
openssl req -new -key apiserver.key -out apiserver.csr -subj "/CN=kube-apiserver"
openssl x509 -req -in apiserver.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out apiserver.crt -days 365
  1. 替换旧证书并重启组件:

bash

运行

复制代码
# 替换证书
cp apiserver.crt apiserver.key /etc/kubernetes/pki/

# 重启服务
sudo systemctl restart kube-apiserver kube-controller-manager kube-scheduler

3.3 注意事项

  1. 证书更新前务必备份:

bash

运行

复制代码
tar -czvf /root/kubernetes-pki-backup.tar.gz /etc/kubernetes/pki
  1. 确保所有节点时间同步,避免因时间差异导致证书验证失败

  2. 更新后全面检查集群状态,包括节点、Pod 和服务可用性

相关推荐
菜地里的小菜鸟5 天前
failed to get imageFs info: non-existent label “docker-images
k8s·failedtogetimagefsin·k8s报错
菜地里的小菜鸟7 天前
kubectl debug
k8s·kubectldebug
腾飞开源9 天前
01_K8s干货笔记之认识K8s
运维·笔记·云原生·容器·kubernetes·k8s·容器化部署
小匠石钧知12 天前
02_在多个RockyLinux10虚拟机上安装k8s集群
云原生·容器·kubernetes·k8s
ShirleyWang01218 天前
让headlamp控制台能访问
linux·服务器·python·k8s·k3s
spider_xcxc18 天前
K8s 部署学习笔记
docker·容器·kubernetes·云计算·k8s
ShirleyWang01218 天前
Day02 K3s NGF(Nginx Gateway Fabric)单 Worker 环境网关更新与故障处置 SOP
linux·服务器·python·k8s·k3s
ShirleyWang01218 天前
DAY01 K3s 私有化部署排障复盘与 SOP
linux·服务器·k8s·k3s·企业部署
XUHUOJUN22 天前
AKS 不是安装在 Windows Server 上,而是运行在 Windows Server 之上的 Azure 平台能力
windows·架构·k8s·azure local·azure stack
Geek-Chow22 天前
Connecting kubectl to a Private EKS Cluster Over an Internal Domain
kubernetes·k8s·aws