Kubernetes教程FG070-Kubernetes集群备份与恢复实战
内容简介
本篇文章主要介绍Kubernetes集群的备份与恢复方法。风哥教程参考Kubernetes官方文档备份与恢复相关内容,结合生产环境实际操作场景,详细讲解集群备份的策略、工具和恢复方法。
目录大纲
Part01-基础概念与理论知识
1.1 备份与恢复概述
Kubernetes集群备份与恢复是确保集群数据安全和业务连续性的重要措施,它包括:
- etcd备份:备份集群的核心数据,包括配置、状态等
- 应用数据备份:备份应用的业务数据
- 集群配置备份:备份集群的配置文件和资源定义
- 灾难恢复:在集群发生故障时,快速恢复集群运行
1.2 备份策略
常见的备份策略包括:
- 完全备份:备份所有数据
- 增量备份:只备份自上次备份以来变化的数据
- 差异备份:只备份自上次完全备份以来变化的数据
- 定时备份:按照预定的时间间隔进行备份
- 实时备份:实时同步数据到备份存储
Part02-生产环境规划与建议
2.1 备份方案设计
- 备份频率:,风哥提示:。
- etcd:每日至少一次
- 应用数据:根据业务重要性确定,每日或每小时
- 集群配置:每次变更后备份
- 存储位置:
- 本地存储:快速访问,但风险高
- 网络存储:如NFS、S3等,安全性高
- 异地存储:防止本地灾难
- 保留策略:
- 完全备份:保留7-30天
- 增量备份:保留3-7天
- 重要备份:长期保留
2.2 恢复策略制定
- 恢复时间目标(RTO):从故障发生到系统恢复的最大允许时间
- 恢复点目标(RPO):故障发生后,系统恢复到的最近备份点
- 恢复测试:定期测试恢复流程,确保备份可用
- 恢复演练:定期进行灾难恢复演练,提高应对能力
Part03-生产环境项目实施方案
3.1 etcd备份
备份etcd数据,风哥提示:。
手动备份etcd
# 备份etcd数据
[root@fgedu-master ~]# ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-backup-$(date +%Y%m%d%H%M%S).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
[root@fgedu-master ~]# ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-backup-$(date +%Y%m%d%H%M%S).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
Snapshot saved at /backup/etcd-backup-20240101120000.db
定时备份etcd
# 创建备份脚本
[root@fgedu-master ~]# cat > etcd-backup.sh << EOF #!/bin/bash # etcd-backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn BACKUP_DIR="/backup/etcd" DATE=$(date +%Y%m%d%H%M%S) ETCDCTL_API=3 etcdctl snapshot save ${BACKUP_DIR}/etcd-backup-${DATE}.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 # 保留最近7天的备份 find ${BACKUP_DIR} -name "etcd-backup-*.db" -mtime +7 -delete,学习交流加群风哥微信: itpux-com。 EOF
[root@fgedu-master ~]# cat > etcd-backup.sh << EOF #!/bin/bash # etcd-backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn BACKUP_DIR="/backup/etcd" DATE=$(date +%Y%m%d%H%M%S) ETCDCTL_API=3 etcdctl snapshot save ${BACKUP_DIR}/etcd-backup-${DATE}.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 # 保留最近7天的备份 find ${BACKUP_DIR} -name "etcd-backup-*.db" -mtime +7 -delete,学习交流加群风哥微信: itpux-com。 EOF
# 赋予脚本执行权限
[root@fgedu-master ~]# chmod +x etcd-backup.sh
[root@fgedu-master ~]# chmod +x etcd-backup.sh
# 添加到crontab
[root@fgedu-master ~]# crontab -e
[root@fgedu-master ~]# crontab -e
# 每天凌晨2点备份etcd
0 2 * * * /root/etcd-backup.sh
0 2 * * * /root/etcd-backup.sh
3.2 应用数据备份
备份应用数据。
备份PersistentVolume数据
# 创建备份Pod
[root@fgedu-master ~]# cat > backup-pod.yaml << EOF apiVersion: v1 kind: Pod metadata: name: backup-pod namespace: default spec: containers: - name: backup image: busybox:latest command: ["/bin/sh", "-c", "tar -czf /backup/data-backup-$(date +%Y%m%d%H%M%S).tar.gz /data"] volumeMounts: - name: data-volume mountPath: /data - name: backup-volume mountPath: /backup volumes: - name: data-volume persistentVolumeClaim: claimName: fgedu-data-pvc - name: backup-volume hostPath: path: /backup restartPolicy: OnFailure EOF
[root@fgedu-master ~]# cat > backup-pod.yaml << EOF apiVersion: v1 kind: Pod metadata: name: backup-pod namespace: default spec: containers: - name: backup image: busybox:latest command: ["/bin/sh", "-c", "tar -czf /backup/data-backup-$(date +%Y%m%d%H%M%S).tar.gz /data"] volumeMounts: - name: data-volume mountPath: /data - name: backup-volume mountPath: /backup volumes: - name: data-volume persistentVolumeClaim: claimName: fgedu-data-pvc - name: backup-volume hostPath: path: /backup restartPolicy: OnFailure EOF
# 应用Pod配置
[root@fgedu-master ~]# kubectl apply -f backup-pod.yaml
[root@fgedu-master ~]# kubectl apply -f backup-pod.yaml
备份应用配置
# 备份所有应用配置
[root@fgedu-master ~]# kubectl get all -n fgedu-production -o yaml > /backup/app-config-$(date +%Y%m%d%H%M%S).yaml
[root@fgedu-master ~]# kubectl get all -n fgedu-production -o yaml > /backup/app-config-$(date +%Y%m%d%H%M%S).yaml
3.3 集群恢复
恢复集群。
恢复etcd数据
# 停止etcd服务
[root@fgedu-master ~]# systemctl stop etcd
[root@fgedu-master ~]# systemctl stop etcd
,学习交流加群风哥QQ113257174。
# 恢复etcd数据
[root@fgedu-master ~]# ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-backup-20240101120000.db \
–data-dir=/var/lib/etcd \
–name=fgedu-master \
–initial-cluster=fgedu-master=https://192.168.1.100:2380 \
–initial-cluster-token=etcd-cluster-1 \
–initial-advertise-peer-urls=https://192.168.1.100:2380
[root@fgedu-master ~]# ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-backup-20240101120000.db \
–data-dir=/var/lib/etcd \
–name=fgedu-master \
–initial-cluster=fgedu-master=https://192.168.1.100:2380 \
–initial-cluster-token=etcd-cluster-1 \
–initial-advertise-peer-urls=https://192.168.1.100:2380
# 启动etcd服务
[root@fgedu-master ~]# systemctl start etcd
[root@fgedu-master ~]# systemctl start etcd
恢复应用数据
# 创建恢复Pod[root@fgedu-master ~]# cat > restore-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: restore-pod
namespace: default
spec:
containers:
- name: restore
image: busybox:latest
command: ["/bin/sh", "-c", "tar -xzf /backup/data-backup-20240101120000.tar.gz -C /data"]
volumeMounts:
- name: data-volume
mountPath: /data
- name: backup-volume
mountPath: /backup
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: fgedu-data-pvc
- name: backup-volume
hostPath:
path: /backup
restartPolicy: OnFailure
EOF
# 应用Pod配置
[root@fgedu-master ~]# kubectl apply -f restore-pod.yaml
[root@fgedu-master ~]# kubectl apply -f restore-pod.yaml
Part04-生产案例与实战讲解
4.1 企业级集群备份
某企业需要为其Kubernetes集群设计一个完整的备份方案。
案例背景
- 集群规模:3个主节点,10个工作节点
- 应用数量:20个应用
- 数据重要性:
- 核心业务数据:高重要性
- 配置数据:中重要性
- 日志数据:低重要性
- 备份需求:
- ,更多视频教程www.fgedu.net.cn。
- etcd:每日备份
- 核心业务数据:每小时备份
- 配置数据:每次变更后备份
- 保留策略:完全备份保留30天,增量备份保留7天
部署方案
# 1. 配置备份存储
# 创建NFS存储
mkdir -p /nfs/backup
# 配置NFS服务
cat > /etc/exports << EOF /nfs/backup *(rw,sync,no_root_squash) EOF systemctl restart nfs-server # 2. 配置etcd备份 # 创建etcd备份脚本 cat > /root/etcd-backup.sh << EOF #!/bin/bash # etcd-backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn BACKUP_DIR="/nfs/backup/etcd" DATE=$(date +%Y%m%d%H%M%S) # 创建备份目录 mkdir -p ${BACKUP_DIR} # 备份etcd ETCDCTL_API=3 etcdctl snapshot save ${BACKUP_DIR}/etcd-backup-${DATE}.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 # 保留最近30天的备份 find ${BACKUP_DIR} -name "etcd-backup-*.db" -mtime +30 -delete EOF # 赋予脚本执行权限 chmod +x /root/etcd-backup.sh # 添加到crontab crontab -e # 每天凌晨2点备份etcd 0 2 * * * /root/etcd-backup.sh # 3. 配置应用数据备份 # 创建应用数据备份脚本 cat > /root/app-backup.sh << EOF #!/bin/bash # app-backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn BACKUP_DIR="/nfs/backup/app" DATE=$(date +%Y%m%d%H%M%S) # 创建备份目录 mkdir -p ${BACKUP_DIR} # 备份核心业务数据 kubectl get pv -o jsonpath='{.items[*].spec.claimRef.name}' | xargs -I {} kubectl get pvc {} -o jsonpath='{.spec.volumeName}' | xargs -I {} cp /var/lib/kubelet/pods/*/{}/volumes/kubernetes.io~nfs/* ${BACKUP_DIR}/app-backup-${DATE}/ # 保留最近7天的备份 find ${BACKUP_DIR} -name "app-backup-*" -mtime +7 -delete EOF # 赋予脚本执行权限 chmod +x /root/app-backup.sh # 添加到crontab crontab -e # 每小时备份应用数据 0 * * * * /root/app-backup.sh # 4. 配置配置数据备份 # 创建配置数据备份脚本 cat > /root/config-backup.sh << EOF,更多学习教程公众号风哥教程itpux_com。 #!/bin/bash # config-backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn BACKUP_DIR="/nfs/backup/config" DATE=$(date +%Y%m%d%H%M%S) # 创建备份目录 mkdir -p ${BACKUP_DIR} # 备份所有命名空间的配置 kubectl get all --all-namespaces -o yaml > ${BACKUP_DIR}/config-backup-${DATE}.yaml
# 保留最近30天的备份
find ${BACKUP_DIR} -name “config-backup-*.yaml” -mtime +30 -delete
EOF
# 赋予脚本执行权限
chmod +x /root/config-backup.sh
# 添加到crontab
crontab -e
# 每天凌晨3点备份配置数据
0 3 * * * /root/config-backup.sh
# 5. 配置备份监控
# 创建监控脚本
cat > /root/backup-monitor.sh << EOF #!/bin/bash # backup-monitor.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn BACKUP_DIR="/nfs/backup" # 检查备份是否成功 if [ ! -f ${BACKUP_DIR}/etcd/etcd-backup-$(date +%Y%m%d)*.db ]; then echo "etcd backup failed" | mail -s "Kubernetes Backup Alert" admin@fgedu.net.cn fi if [ ! -f ${BACKUP_DIR}/app/app-backup-$(date +%Y%m%d)* ]; then echo "app backup failed" | mail -s "Kubernetes Backup Alert" admin@fgedu.net.cn fi if [ ! -f ${BACKUP_DIR}/config/config-backup-$(date +%Y%m%d)*.yaml ]; then echo "config backup failed" | mail -s "Kubernetes Backup Alert" admin@fgedu.net.cn fi EOF # 赋予脚本执行权限 chmod +x /root/backup-monitor.sh # 添加到crontab crontab -e # 每天凌晨4点检查备份 0 4 * * * /root/backup-monitor.sh
# 创建NFS存储
mkdir -p /nfs/backup
# 配置NFS服务
cat > /etc/exports << EOF /nfs/backup *(rw,sync,no_root_squash) EOF systemctl restart nfs-server # 2. 配置etcd备份 # 创建etcd备份脚本 cat > /root/etcd-backup.sh << EOF #!/bin/bash # etcd-backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn BACKUP_DIR="/nfs/backup/etcd" DATE=$(date +%Y%m%d%H%M%S) # 创建备份目录 mkdir -p ${BACKUP_DIR} # 备份etcd ETCDCTL_API=3 etcdctl snapshot save ${BACKUP_DIR}/etcd-backup-${DATE}.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 # 保留最近30天的备份 find ${BACKUP_DIR} -name "etcd-backup-*.db" -mtime +30 -delete EOF # 赋予脚本执行权限 chmod +x /root/etcd-backup.sh # 添加到crontab crontab -e # 每天凌晨2点备份etcd 0 2 * * * /root/etcd-backup.sh # 3. 配置应用数据备份 # 创建应用数据备份脚本 cat > /root/app-backup.sh << EOF #!/bin/bash # app-backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn BACKUP_DIR="/nfs/backup/app" DATE=$(date +%Y%m%d%H%M%S) # 创建备份目录 mkdir -p ${BACKUP_DIR} # 备份核心业务数据 kubectl get pv -o jsonpath='{.items[*].spec.claimRef.name}' | xargs -I {} kubectl get pvc {} -o jsonpath='{.spec.volumeName}' | xargs -I {} cp /var/lib/kubelet/pods/*/{}/volumes/kubernetes.io~nfs/* ${BACKUP_DIR}/app-backup-${DATE}/ # 保留最近7天的备份 find ${BACKUP_DIR} -name "app-backup-*" -mtime +7 -delete EOF # 赋予脚本执行权限 chmod +x /root/app-backup.sh # 添加到crontab crontab -e # 每小时备份应用数据 0 * * * * /root/app-backup.sh # 4. 配置配置数据备份 # 创建配置数据备份脚本 cat > /root/config-backup.sh << EOF,更多学习教程公众号风哥教程itpux_com。 #!/bin/bash # config-backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn BACKUP_DIR="/nfs/backup/config" DATE=$(date +%Y%m%d%H%M%S) # 创建备份目录 mkdir -p ${BACKUP_DIR} # 备份所有命名空间的配置 kubectl get all --all-namespaces -o yaml > ${BACKUP_DIR}/config-backup-${DATE}.yaml
# 保留最近30天的备份
find ${BACKUP_DIR} -name “config-backup-*.yaml” -mtime +30 -delete
EOF
# 赋予脚本执行权限
chmod +x /root/config-backup.sh
# 添加到crontab
crontab -e
# 每天凌晨3点备份配置数据
0 3 * * * /root/config-backup.sh
# 5. 配置备份监控
# 创建监控脚本
cat > /root/backup-monitor.sh << EOF #!/bin/bash # backup-monitor.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn BACKUP_DIR="/nfs/backup" # 检查备份是否成功 if [ ! -f ${BACKUP_DIR}/etcd/etcd-backup-$(date +%Y%m%d)*.db ]; then echo "etcd backup failed" | mail -s "Kubernetes Backup Alert" admin@fgedu.net.cn fi if [ ! -f ${BACKUP_DIR}/app/app-backup-$(date +%Y%m%d)* ]; then echo "app backup failed" | mail -s "Kubernetes Backup Alert" admin@fgedu.net.cn fi if [ ! -f ${BACKUP_DIR}/config/config-backup-$(date +%Y%m%d)*.yaml ]; then echo "config backup failed" | mail -s "Kubernetes Backup Alert" admin@fgedu.net.cn fi EOF # 赋予脚本执行权限 chmod +x /root/backup-monitor.sh # 添加到crontab crontab -e # 每天凌晨4点检查备份 0 4 * * * /root/backup-monitor.sh
4.2 灾难恢复实战
某企业的Kubernetes集群发生灾难,需要进行恢复。。
案例背景
- 灾难类型:主节点故障,etcd数据损坏
- 备份情况:
- etcd:有24小时内的备份
- 应用数据:有1小时内的备份
- 配置数据:有24小时内的备份
- 恢复目标:在4小时内恢复集群运行
恢复方案
# 1. 恢复etcd数据
[root@fgedu-master ~]# systemctl stop etcd kube-apiserver kube-controller-manager kube-scheduler
。
[root@fgedu-master ~]# ETCDCTL_API=3 etcdctl snapshot restore /nfs/backup/etcd/etcd-backup-20240101120000.db \
–data-dir=/var/lib/etcd \
–name=fgedu-master \,from K8S+DB视频:www.itpux.com。
–initial-cluster=fgedu-master=https://192.168.1.100:2380 \
–initial-cluster-token=etcd-cluster-1 \
–initial-advertise-peer-urls=https://192.168.1.100:2380
[root@fgedu-master ~]# systemctl stop etcd kube-apiserver kube-controller-manager kube-scheduler
。
[root@fgedu-master ~]# ETCDCTL_API=3 etcdctl snapshot restore /nfs/backup/etcd/etcd-backup-20240101120000.db \
–data-dir=/var/lib/etcd \
–name=fgedu-master \,from K8S+DB视频:www.itpux.com。
–initial-cluster=fgedu-master=https://192.168.1.100:2380 \
–initial-cluster-token=etcd-cluster-1 \
–initial-advertise-peer-urls=https://192.168.1.100:2380
[root@fgedu-master ~]# systemctl start etcd kube-apiserver kube-controller-manager kube-scheduler
# 2. 恢复应用数据
[root@fgedu-master ~]# kubectl apply -f restore-pod.yaml
[root@fgedu-master ~]# kubectl apply -f restore-pod.yaml
# 3. 恢复配置数据
[root@fgedu-master ~]# kubectl apply -f /nfs/backup/config/config-backup-20240101120000.yaml
[root@fgedu-master ~]# kubectl apply -f /nfs/backup/config/config-backup-20240101120000.yaml
# 4. 验证恢复结果
[root@fgedu-master ~]# kubectl get nodes
[root@fgedu-master ~]# kubectl get pods –all-namespaces
[root@fgedu-master ~]# kubectl get services –all-namespaces
[root@fgedu-master ~]# kubectl get nodes
[root@fgedu-master ~]# kubectl get pods –all-namespaces
[root@fgedu-master ~]# kubectl get services –all-namespaces
Part05-风哥经验总结与分享
5.1 备份与恢复最佳实践
- 定期备份:根据数据重要性制定合理的备份频率
- 多存储位置:将备份存储在多个位置,防止单点故障
- 验证备份:定期验证备份的完整性和可恢复性
- 自动化备份:使用脚本和定时任务自动化备份过程
- 监控备份:监控备份过程,及时发现备份失败
- 制定恢复计划:制定详细的恢复计划,包括步骤和时间点
- 定期演练:定期进行恢复演练,提高应对能力
- 文档化:详细记录备份和恢复过程,便于操作
- 版本控制:对备份文件进行版本控制,便于追溯
- 安全存储:确保备份存储的安全性,防止数据泄露
5.2 常见问题与解决方案
问题 原因 解决方案
备份失败 权限不足 检查备份目录权限
备份文件过大 备份频率过高 调整备份策略,使用增量备份
恢复失败 备份文件损坏 定期验证备份文件
恢复时间过长 备份文件过大 优化备份策略,使用增量备份
备份存储空间不足 存储容量不够 清理过期备份,增加存储容量
备份网络延迟 网络带宽不足 选择合适的备份时间,使用本地存储
恢复后应用不可用 应用依赖缺失 完整备份应用依赖
etcd恢复失败 版本不匹配 使用相同版本的etcd进行恢复
备份失败 权限不足 检查备份目录权限
备份文件过大 备份频率过高 调整备份策略,使用增量备份
恢复失败 备份文件损坏 定期验证备份文件
恢复时间过长 备份文件过大 优化备份策略,使用增量备份
备份存储空间不足 存储容量不够 清理过期备份,增加存储容量
备份网络延迟 网络带宽不足 选择合适的备份时间,使用本地存储
恢复后应用不可用 应用依赖缺失 完整备份应用依赖
etcd恢复失败 版本不匹配 使用相同版本的etcd进行恢复
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
