k8s集群日常巡检
Kubernetes 集群备份与恢复方案
在生产环境中,Kubernetes 集群的备份是非常重要的。为了确保集群的可靠性和高可用性,备份策略应当包括物理备份和逻辑备份两种方式。我们将用到 etcd
和 velero
实现备份和恢复操作。
1. 备份方案制定
物理备份:etcd 备份
etcd
是 Kubernetes 的分布式键值存储系统,保存着集群的所有状态数据。备份 etcd
可以确保在灾难恢复时恢复到某个时刻的集群状态。物理备份的优点是速度快,可以快速完成备份和恢复,但缺点是不能对元数据进行细粒度控制。
逻辑备份:velero 备份
velero
是 Kubernetes 的备份和恢复工具,可以对指定命名空间、资源类型等进行备份。其优点是提供了细粒度的备份能力,支持选择备份特定的资源。与 etcd
备份结合使用时,可以在快速恢复的同时,还能灵活恢复部分数据。
2. Etcd 备份
2.1 创建备份脚本
首先,创建一个备份脚本 /opt/etcd_backup.sh
,用于定期备份 etcd
数据。
#!/usr/bin/env bash
#
# Etcd backup
set -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="/var/lib/docker/etcd_backup"
DT=$(date +%Y%m%d.%H%M%S)
# 创建备份目录
[[ ! -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-${DT}.db"
# 输出备份成功信息
echo "Etcd backup success, backup file: ${BACKUP_DIR}/etcd-snapshot-${DT}.db, \
file size: $(du -sh ${BACKUP_DIR}/etcd-snapshot-${DT}.db | awk '{print $1}')"
echo
2.2 配置定时任务
使用 cron
定时任务执行备份脚本。打开 crontab
编辑器,添加以下行:
0 */1 * * * /bin/bash /opt/etcd_backup.sh >>/opt/log-backup-etcd.log 2>&1
这个任务会每小时执行一次备份操作。
3. Velero 备份
3.1 安装与配置 Velero
首先,下载并安装 velero
。
# 下载 velero 安装包
wget https://github.com/vmware-tanzu/velero/releases/download/v1.8.1/velero-v1.8.1-linux-amd64.tar.gz
# 解压安装包
tar -xvf velero-v1.8.1-linux-amd64.tar.gz
# 将 velero 移动到 /usr/bin 目录
cp velero-v1.8.1-linux-amd64/velero /usr/bin/
# 设置命令补全
velero completion bash > /etc/bash_completion.d/velero.sh
source /etc/bash_completion.d/velero.sh
3.2 配置存储凭证
创建一个凭证文件 credentials-velero
,其中包含 AWS 的访问密钥:
aws_access_key_id=xxx
aws_secret_access_key=xxx
3.3 安装 Velero
使用以下命令安装 velero
:
velero install --provider aws \
--plugins velero/velero-plugin-for-aws:v1.1.0 \
--bucket velero-xxx \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--use-restic \
--default-volumes-to-restic=false \
--backup-location-config region=ap-shanghai,s3ForcePathStyle="true",s3Url=https://cos.ap-shanghai.myqcloud.com \
--restic-pod-cpu-request=1000m --restic-pod-cpu-limit=2000m \
--restic-pod-mem-request=1024Mi --restic-pod-mem-limit=4096Mi \
--velero-pod-cpu-request=1000m --velero-pod-cpu-limit=2000m \
--velero-pod-mem-request=1024Mi --velero-pod-mem-limit=4096Mi
安装完成后,可以通过以下命令检查备份存储位置是否可用:
velero backup-location get
3.4 创建定时备份任务
根据实际需求,可以设置定期备份指定的命名空间或资源类型。例如:
velero create schedule xxx --schedule="0 1 * * *" --include-namespaces=prod \
--snapshot-volumes=false --default-volumes-to-restic=false --ttl=168h
4. Etcd 恢复
4.1 创建备份目录
在恢复过程中,首先创建备份目录:
mkdir -p /opt/k8s_manifests_backup
4.2 停止 kube-apiserver 服务
在恢复之前,首先停止 kube-apiserver
服务:
mv /etc/kubernetes/manifests/kube-apiserver.yaml /opt/k8s_manifests_backup/
# 检查服务是否已停止
kubectl get pod -n kube-system | grep kube-apiserver
4.3 停止 etcd 服务
记录 etcd
服务的相关参数,并停止服务:
# 记录 etcd 的启动参数
ps -ef | grep etcd
# 停止 etcd 服务
mv /etc/kubernetes/manifests/etcd.yaml /opt/k8s_manifests_backup/
# 检查服务是否已停止
docker ps | grep etcd
4.4 移除 etcd 存储目录
mv /data/etcd{,.bak}
4.5 恢复快照
将快照文件拷贝到所有 etcd 节点,并进行恢复:
ETCDCTL_API=3 /usr/local/bin/etcdctl snapshot restore /tmp/xxx.db \
--name hostname1 \
--initial-cluster "hostname1=https://ip1:2380,hostname2=https://ip2:2380,hostname3=https://ip3:2380" \
--initial-cluster-token k8s_etcd \
--initial-advertise-peer-urls https://ip1:2380 \
--data-dir=/data/etcd
4.6 启动 etcd 服务
恢复完成后,启动 etcd 服务:
mv /opt/k8s_manifests_backup/etcd.yaml /etc/kubernetes/manifests/
# 检查服务状态
ETCDCTL_API=3 /usr/local/bin/etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--endpoints=https://ip1:2379,https://ip2:2379,https://ip3:2379 \
endpoint health
4.7 启动 kube-apiserver 服务
恢复完 etcd 后,重新启动 kube-apiserver
服务:
mv /opt/k8s_manifests_backup/kube-apiserver.yaml /etc/kubernetes/manifests/
# 检查服务状态
kubectl get pod -n kube-system | grep kube-apiserver
4.8 验证恢复情况
确保集群恢复成功,并运行正常。
5. Velero 恢复
5.1 查询备份信息
查看 Velero 的备份信息:
velero backup get
5.2 恢复备份
下载并解压备份文件,然后应用 YAML 文件进行恢复:
# 下载备份文件
velero backup download filename
# 解压备份文件
tar -xvf xxx.tar.gz
# 恢复指定的资源
kubectl apply -f filename/dirname
Kubernetes 集群的备份与恢复是确保集群高可用的重要手段。备份方案可以结合使用物理备份(etcd
)和逻辑备份(velero
)来提高备份的速度和灵活性。恢复过程应严格按照顺序进行:先停止 kube-apiserver
,再停止 etcd
,然后恢复数据,最后重新启动服务。
企业级备份工具Velero
`Velero` 是一个开源的 Kubernetes 备份和恢复工具,用来对 Kubernetes 集群中的资源和持久化存储(如 PVC、PV)进行备份、恢复以及灾难恢复。
主要功能:
- 备份与恢复:
`Velero` 允许用户备份整个集群或特定命名空间、资源类型(如 Deployments、ConfigMaps、Secrets 等),并支持恢复这些备份。它不仅可以备份集群的 Kubernetes 资源,还能备份持久化存储卷(如 PV 和 PVC),使用支持的插件(例如 AWS、GCP、Azure 或其他支持的存储后端)进行备份存储。
- 定时备份:
`Velero` 允许用户创建定期备份任务,并指定备份的频率和生命周期。这使得集群中的数据备份可以定期执行,减少了管理员的工作负担。
- 跨集群恢复:
Velero 不仅支持集群内的恢复,还支持跨集群的资源迁移,适用于集群迁移、灾难恢复等场景。
- 多种存储后端支持:
`Velero` 支持将备份数据存储到多种后端,包括 AWS S3、Google Cloud Storage、Azure Blob Storage,以及任何兼容的对象存储系统(如 MinIO、Aliyun OSS 等)。
- 持久化卷(Volume)快照:
`Velero` 还支持使用快照技术来备份和恢复持久化卷(例如使用 `Restic` 或使用云提供商原生快照功能)。这可以更高效地备份数据。
- 资源过滤与选择:
用户可以灵活地选择备份的资源类型,如指定某个命名空间、标签、资源等,来创建精确的备份集。
Velero 的常见用例:
- 灾难恢复:在发生故障或数据丢失的情况下,使用 Velero 恢复整个集群或指定资源。
- 集群迁移:通过 Velero 将资源从一个 Kubernetes 集群迁移到另一个集群。
- 定期备份:确保集群资源和持久化存储的定期备份,防止数据丢失。
- 多集群管理:支持跨多个 Kubernetes 集群进行备份和恢复操作。
工作原理:
- 安装与配置:首先在 Kubernetes 集群中安装 Velero,通过配置存储后端(如 S3、GCP、Azure 等)和备份目标位置。
- 备份:运行备份命令,指定备份范围(命名空间、资源类型等),并将备份数据存储在指定的存储后端。
- 恢复:运行恢复命令,恢复整个集群、指定命名空间或指定资源。
- 定时任务:设置定期备份的调度,自动化备份流程。
示例命令:
-
备份整个集群:
velero backup create <backup-name> --include-namespaces <namespace-name>
-
恢复备份:
velero restore create --from-backup <backup-name>
-
创建定时备份任务:
velero create schedule <schedule-name> --schedule="0 1 * * *" --include-namespaces <namespace-name>
-
Velero 是 Kubernetes 的备份和恢复利器,适用于集群中的数据保护、迁移和灾难恢复等场景,帮助企业和用户在 Kubernetes 环境中高效管理集群数据安全。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!