随笔 - 307  文章 - 0  评论 - 5  阅读 - 4264

k8s集群日常巡检

Kubernetes 集群备份与恢复方案

在生产环境中,Kubernetes 集群的备份是非常重要的。为了确保集群的可靠性和高可用性,备份策略应当包括物理备份和逻辑备份两种方式。我们将用到 etcdvelero 实现备份和恢复操作。

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)进行备份、恢复以及灾难恢复。

主要功能:

  1. 备份与恢复:
   `Velero` 允许用户备份整个集群或特定命名空间、资源类型(如 Deployments、ConfigMaps、Secrets 等),并支持恢复这些备份。它不仅可以备份集群的 Kubernetes 资源,还能备份持久化存储卷(如 PV 和 PVC),使用支持的插件(例如 AWS、GCP、Azure 或其他支持的存储后端)进行备份存储。

  1. 定时备份:
   `Velero` 允许用户创建定期备份任务,并指定备份的频率和生命周期。这使得集群中的数据备份可以定期执行,减少了管理员的工作负担。
  1. 跨集群恢复:
   Velero 不仅支持集群内的恢复,还支持跨集群的资源迁移,适用于集群迁移、灾难恢复等场景。
  1. 多种存储后端支持:
   `Velero` 支持将备份数据存储到多种后端,包括 AWS S3、Google Cloud Storage、Azure Blob Storage,以及任何兼容的对象存储系统(如 MinIO、Aliyun OSS 等)。
  1. 持久化卷(Volume)快照:
   `Velero` 还支持使用快照技术来备份和恢复持久化卷(例如使用 `Restic` 或使用云提供商原生快照功能)。这可以更高效地备份数据。
  1. 资源过滤与选择:
   用户可以灵活地选择备份的资源类型,如指定某个命名空间、标签、资源等,来创建精确的备份集。

Velero 的常见用例:

  • 灾难恢复:在发生故障或数据丢失的情况下,使用 Velero 恢复整个集群或指定资源。
  • 集群迁移:通过 Velero 将资源从一个 Kubernetes 集群迁移到另一个集群。
  • 定期备份:确保集群资源和持久化存储的定期备份,防止数据丢失。
  • 多集群管理:支持跨多个 Kubernetes 集群进行备份和恢复操作。

工作原理:

  1. 安装与配置:首先在 Kubernetes 集群中安装 Velero,通过配置存储后端(如 S3、GCP、Azure 等)和备份目标位置。
  2. 备份:运行备份命令,指定备份范围(命名空间、资源类型等),并将备份数据存储在指定的存储后端。
  3. 恢复:运行恢复命令,恢复整个集群、指定命名空间或指定资源。
  4. 定时任务:设置定期备份的调度,自动化备份流程。

示例命令:

  • 备份整个集群:

    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 环境中高效管理集群数据安全。

posted on   Leo-Yide  阅读(17)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示