ITPUB

K8s 无备份,不运维!

K8s 已经成为主流的容器平台,越来越多的公司把核心业务部署在 K8s 集群中。但集群一旦投入生产运行,也意味着必须直面各种运维风险,比如集群异常、误操作、etcd 数据损坏,甚至整套集群不可用。一旦这些问题发生,轻则业务中断,重则数据丢失,直接影响线上服务和业务稳定性。

为了降低这些风险,K8s 的备份与恢复就成了一项“必须提前准备”的基础能力。通过定期备份集群关键数据和业务资源,在出现故障时才能有回退和兜底方案,快速恢复系统状态,避免长时间停机。

K8s备份方案选择

备份类型
适用场景
优点
缺点
etcd物理备份
应对集群级故障,例如etcd崩溃、K8s集群异常。
备份/恢复非常快(分钟级),适合紧急恢复。
只能恢复整个集群,不能恢复单个应用。
velero逻辑备份
应对业务级故障,例如误删某个命名空间、应用故障。
可精准备份、恢复指定命名空间或资源,备份文件可修改。
备份/恢复速度相对慢,不能恢复etcd层面的集群配置。
最佳实践:两者结合使用:etcd备份做“底线保护”(每小时一次),velero做“精细保护”(每天一次),全面覆盖故障场景。

Etcd 物理备份

适用场景:

  • 集群巡检时必须进行的操作。

  • 在集群升级或修改核心组件前,手动触发备份,防止操作失误。

  1. 创建备份脚本:自动执行备份,保留7天内的备份文件,避免磁盘爆满。

#!/usr/bin/env bashset -e  # 脚本遇到错误立即退出
# 配置路径(不需修改)ETCD_CA_CERT="/etc/kubernetes/pki/etcd/ca.crt"ETCD_CERT="/etc/kubernetes/pki/etcd/server.crt"ETCD_KEY="/etc/kubernetes/pki/etcd/server.key"BACKUP_DIR="/opt/etcd_backup"  # 备份文件存储路径
# 创建备份目录[ ! -d "${BACKUP_DIR}" ] && mkdir -p ${BACKUP_DIR}
# 删除7天前的备份文件find ${BACKUP_DIR} -name "*.db" -mtime +7 -exec rm -f {} \;
# 执行etcd快照备份ETCDCTL_API=3 /usr/local/bin/etcdctl --endpoints=https://127.0.0.1:2379 \  --cacert="${ETCD_CA_CERT}" --cert="${ETCD_CERT}" --key="${ETCD_KEY}" \  snapshot save "${BACKUP_DIR}/etcd-snapshot-$(date +%Y%m%d.%H%M%S).db"
2. 设置定时任务
# 设置定时任务crontab -e # 在crontab中添加:每小时执行一次备份脚本0 */1 * * * /bin/bash /opt/etcd_backup.sh >> /opt/etcd_backup.log 2>&1

Etcd 恢复

适用场景:

  • etcd数据损坏、集群完全不可用时。

  • 恢复会覆盖当前etcd所有数据,确保恢复点是最新的。

  1. 准备恢复:停止kube-apiserver和etcd服务,并清空旧数据。

  2. 执行恢复:从备份文件恢复etcd数据。

ETCDCTL_API=3 /usr/local/bin/etcdctl snapshot restore /tmp/etcd-snapshot-xxx.db \  --name etcd1 \  --initial-cluster "etcd1=https://<ip>:2380,etcd2=https://<ip>:2380,etcd3=https://<ip>:2380" \  --data-dir=/var/lib/etcd
3. 验证恢复:检查集群健康状态,确保恢复成功。
ETCDCTL_API=3 /usr/local/bin/etcdctl endpoint health

Velero 逻辑备份

适用场景:

  • 误删了业务命名空间(如prod),导致业务配置丢失。

  • 业务版本发布前,备份当前环境,方便发布失败时回滚。

  • 跨集群迁移业务(如从测试集群迁移到生产集群)。

  1. 安装Velero

wget https://github.com/vmware-tanzu/velero/releases/download/v1.8.1/velero-v1.8.1-linux-amd64.tar.gztar -xvf velero-v1.8.1-linux-amd64.tar.gzcp velero-v1.8.1-linux-amd64/velero /usr/bin/chmod +x /usr/bin/velerovelero version
2. 创建定时备份任务
# 创建备份计划,例如备份prod命名空间velero create schedule prod-daily-backup \  --schedule="0 1 * * *" \  # 每天凌晨1点执行  --include-namespaces=prod \  # 备份指定命名空间  --ttl=168h  # 保留7天

Velero 恢复

适用场景:

  • 误删prod命名空间、改坏了应用配置。

  • 业务发布失败后,回滚到备份时的状态。

  1. 恢复整个命名空间(常用):

velero restore create --from-backup prod-daily-backup-xxx
  1. 恢复特定资源(例如只恢复某个Deployment):

velero restore create \  --from-backup prod-daily-backup-xxx \  --include-resources=deployments \  --include-namespaces=prod

小结

K8s集群的备份与恢复,不仅是系统维护中的一个重要环节,更是保障业务持续运行、应对突发故障的“生命线”。通过合理的备份策略和恢复流程,我们能够最大限度地减少数据丢失和停机时间,确保集群在任何意外情况下都能迅速恢复。

无论是使用etcd物理备份来保障集群的整体健康,还是利用velero逻辑备份来应对单个应用或命名空间的故障,两者结合的方式将为K8s集群提供双重保障。通过定期巡检备份方案、演练恢复流程,运维团队能够在故障发生时做到胸有成竹,迅速恢复生产环境。

最终,任何一个完备的备份恢复方案,都离不开持续的验证与演练。通过不断完善备份策略并进行定期测试,确保数据恢复不成问题。

Image