15.云原生之k8s容灾与恢复实战

发布时间:2024年01月19日

云原生专栏大纲


容灾和恢复:运维团队需要制定容灾计划和恢复策略,包括定期备份数据、建立冷备份站点、制定灾难恢复计划等,以应对可能的灾难事件,并尽快恢复系统的正常运行。

Velero与etcd介绍

??Velero和etcd都是用于备份和恢复的工具,但它们的应用场景和备份对象有所不同。

  1. Velero
    Velero是一个开源的备份和恢复工具,用于在Kubernetes集群中进行应用和数据的备份和恢复。它可以备份和还原整个Kubernetes集群中的资源对象,包括Pod、Deployment、Service、ConfigMap等。Velero提供了全量备份和增量备份的功能,并支持将备份数据存储在多种后端存储介质中,如云存储、NFS、对象存储等。Velero还提供了恢复策略和调度功能,可以按需进行备份和恢复操作,支持自动化的备份和恢复流程。
  2. etcd快照备份
    etcd是一个分布式键值存储系统,常用于存储Kubernetes集群的状态数据。etcd存储了Kubernetes集群的配置信息、服务发现信息和运行时状态等重要数据。etcd的快照备份是将etcd的数据进行全量备份,以便在需要时进行恢复。etcd提供了内置的快照备份和恢复功能,可以通过etcdctl命令行工具或API进行备份和恢复操作。etcd快照备份通常用于保护etcd数据的完整性和可用性,以防止数据丢失或损坏。

??综上所述,Velero主要用于备份和恢复Kubernetes集群中的应用和资源对象,而etcd快照备份则专注于备份和恢复etcd存储的数据。Velero提供了更全面的备份和恢复功能,适用于整个Kubernetes集群的备份和恢复操作,而etcd的快照备份则更专注于etcd数据的备份和恢复,用于保护etcd存储的数据的完整性和可用性。在使用时,可以根据具体需求选择合适的工具进行备份和恢复操作。

Velero与etcd备份应用场景

Velero和etcd备份在Kubernetes环境中有不同的应用场景:

  1. Velero的应用场景
    • 灾难恢复:Velero可以用于整个Kubernetes集群的灾难恢复。通过备份和恢复资源对象,可以在发生灾难性事件(如硬件故障、数据中心故障)时快速恢复整个集群的状态。
    • 迁移和复制:Velero可以用于将Kubernetes集群中的应用程序和资源对象迁移到其他环境,如生产环境到测试环境的迁移。它还可以用于复制集群,以便在不同的地理位置或云提供商之间创建备份和冗余。
    • 测试和开发环境:Velero可以用于创建测试和开发环境的快速副本。通过备份和还原资源对象,可以在不影响生产环境的情况下进行测试、调试和开发工作。
  2. etcd备份的应用场景
    • etcd数据的完整性保护:etcd是Kubernetes集群的关键组件,存储了集群的配置信息、状态数据等。etcd的备份用于保护etcd数据的完整性,以防止数据丢失或损坏。在发生etcd数据丢失或损坏的情况下,可以使用备份进行恢复。
    • 节点故障恢复:当etcd集群中的节点发生故障时,可以使用etcd的备份进行节点故障恢复。通过恢复备份,可以重新建立故障节点的etcd数据,并使整个集群恢复正常运行。
    • etcd集群的迁移:在进行etcd集群的迁移时,可以使用etcd的备份功能。通过备份和还原etcd数据,可以将etcd集群从一个环境迁移到另一个环境,如从本地环境迁移到云环境。

综上所述,

  1. Velero适用于整个Kubernetes集群的备份和恢复,适用于灾难恢复、迁移和复制、测试和开发环境等场景。
  2. etcd备份主要用于保护etcd数据的完整性和可用性,适用于etcd数据的灾难恢复、节点故障恢复和etcd集群的迁移。根据具体的需求和情况,可以选择合适的备份工具和策略来满足备份和恢复的需求。etcd 快照备份适用于比较严重的集群灾难。比如所有 etcd 集群所有节点宕机,快照文件丢失损坏的情况。
  3. Velero 适用于集群迁移,k8s 子集备份恢复,比如基于命名空间备份。某个命名空间误删,且 YAML 文件没有备份,那么可以 Velero 快速恢复。涉及多API资源对象 的系统升级,可以做升级前备份,升级失败通过 Velero 快速恢复。

Velero与etcd在k8s备份上的区别

在Kubernetes备份方面,Velero和etcd有以下区别:

  1. 备份对象
    • Velero:Velero可以备份和恢复整个Kubernetes集群中的资源对象,包括应用程序的部署、服务、配置、存储卷等。它可以备份和还原多个命名空间中的对象,并支持选择性备份和恢复。
    • etcd:etcd是Kubernetes集群的分布式键值存储,存储了集群的配置信息、状态数据等。etcd备份主要针对etcd存储的数据进行全量备份和恢复,包括集群配置、服务发现、持久卷声明等。
  2. 备份粒度
    • Velero:Velero支持灵活的备份策略,可以进行全量备份和增量备份。增量备份只备份自上次备份以来发生更改的资源对象,减少备份数据的大小和备份时间。
    • etcd:etcd的备份是全量备份,每次备份都会包含所有的etcd数据。etcd的备份是基于时间点的,每个备份都是一个完整的快照,用于恢复到特定时间点的状态。
  3. 备份工具
    • Velero:Velero是一个独立的备份和恢复工具,可以与Kubernetes集群集成使用。它提供了命令行界面和API,以及与各种后端存储介质(如云存储、对象存储、NFS等)的集成。
    • etcd:etcd自带了备份和恢复的功能,可以使用etcdctl命令行工具或API进行备份和恢复操作。etcd的备份数据通常存储在本地文件系统中。
  4. 应用场景
    • Velero:Velero适用于整个Kubernetes集群的备份和恢复,包括应用程序和资源对象的完整性。它可以用于灾难恢复、迁移和测试环境的复制等场景。
    • etcd:etcd备份主要用于保护etcd数据的完整性和可用性。它可以用于etcd数据的灾难恢复、节点故障恢复以及etcd集群的迁移。

??综上所述,Velero和etcd在Kubernetes备份方面有不同的应用和重点。Velero用于备份和恢复整个Kubernetes集群中的资源对象,而etcd备份主要用于保护etcd存储的数据的完整性和可用性。根据具体的备份需求,可以选择合适的工具来进行备份和恢复操作。通常情况下,使用Velero进行整个Kubernetes集群的备份,同时使用etcd的备份功能来保护etcd数据的安全和可用性。

Velero备份恢复流程

  1. Velero客户端调用Kubernetes API Server创建Backup任务。
  2. Backup控制器基于watch机制通过API Server获取到备份任务。
  3. Backup控制器开始执行备份动作,其会通过请求API Server获取需要备份的数据。
  4. Backup 控制器将获取到的数据备份到指定的对象存储server端。

备份工作流程

  1. 当运行时 velero backup create
  2. Velero 客户端调用 Kubernetes API 服务器来创建一个 Backup 对象。
  3. BackupController 通知新对象Backup并执行验证。
  4. BackupController 开始备份过程。它通过查询 API 服务器的资源来收集要备份的数据。
  5. 调用对象存储服务(BackupController 例如 AWS S3)以上传备份文件。

??默认情况下,velero backup create 为任何持久卷制作磁盘快照。您可以通过指定额外的标志来调整快照。运行 velero backup create --help 以查看可用标志。可以使用选项禁用快照 --snapshot-volumes=false。

Velero备份时,若k8s集群发送变化,会发发生情况?

??在使用 Velero 进行 Kubernetes 集群备份时,如果集群发生变化(例如添加、删除或修改了资源),可能会导致一些问题。这些问题可能包括以下情况:

  1. 资源丢失:如果您在备份之后添加了新的资源,而在恢复时没有包含这些资源,那么这些资源将会丢失。
  2. 资源冲突:如果您在备份之后删除了某些资源,而在恢复时仍然尝试恢复这些资源,那么将会发生冲突。
  3. 资源状态不一致:如果备份期间某些资源的状态发生了变化,例如 Pod 的状态、持久卷的状态等,那么在恢复时可能会导致状态不一致的问题。

??为了避免这些情况,建议在进行 Velero 备份之前,确保集群处于稳定状态,并且没有进行重大的更改操作。此外,您还可以定期备份以确保数据的完整性,并测试备份的恢复过程以验证其可靠性。
??另外,值得注意的是,Velero 本身提供了一些机制来处理某些变化,例如通过标签选择器来排除或包含特定的资源。您可以根据自己的需求和情况,使用 Velero 提供的选项来管理备份和恢复过程中的变化。

Velero 备份pv,pv中数据变化,会发发生情况?

??Velero 备份 PV 的过程是通过创建 PV 快照(Snapshot)来实现的。快照是 PV 数据的一个静态副本,用于后续的恢复操作。但是,快照只会捕获创建时刻的 PV 数据状态,并不会实时跟踪 PV 数据的变化。
??如果在快照创建后,PV 中的数据发生了变化,例如文件被修改、删除或添加,那么在使用 Velero 进行恢复时,恢复的 PV 数据将不包含这些变化的内容。恢复的 PV 数据将与创建快照时的状态相同,可能导致数据不一致性的问题。
??为了避免这种情况,建议在进行 Velero 备份之前,确保 PV 中的数据是一致的,并且没有进行重大的更改操作。如果您需要备份实时更新的 PV 数据,可以考虑使用其他工具或方法,如数据同步工具(如 rsync)或数据库备份工具,来定期备份 PV 中的数据。
??另外,注意 Velero 也提供了一些选项来处理 PV 数据的变化,例如通过使用 Velero 插件或钩子来在备份和恢复期间处理数据的一致性。您可以根据自己的需求和情况,使用 Velero 提供的功能来管理 PV 数据的备份和恢复过程中的变化。

恢复工作流程

  1. 当运行时 velero restore create:
  2. Velero 客户端调用 Kubernetes API 服务器来创建一个 Restore 对象。
  3. RestoreController 通知新的 Restore 对象并执行验证。
  4. 从对象存储服务中 RestoreController 获取备份信息。然后它对备份的资源进行一些预处理,以确保这些资源可以在新集群上运行。例如,使用 备份的 API 版本来验证还原资源是否可以在目标集群上运行。
  5. RestoreController 启动还原过程,一次还原每个符合条件的资源。

??默认情况下,Velero 执行非破坏性恢复,这意味着它不会删除目标集群上的任何数据。如果备份中的资源已存在于目标集群中,Velero 将跳过该资源。您可以将 Velero 配置为使用更新策略,而不是使用 --existing-resource-policy 恢复标志。当此标志设置为 时 update,Velero 将尝试更新目标集群中的现有资源以匹配备份中的资源。

k8s中etcd备份恢复

??具体操作参考:K8S集群etcd备份与恢复
??在 Kubernetes (K8s) 中,etcd 是用于存储集群配置和状态的关键组件。进行 etcd 备份和恢复的过程如下:

  1. 备份 etcd 数据:
    • 登录到运行 etcd 的主节点或任意 etcd 成员节点。
    • 停止 kube-apiserver 服务,以确保 etcd 数据不再发生变化。
    • 创建 etcd 数据的备份。可以使用 etcdctl 命令行工具或其他工具进行备份。以下是使用 etcdctl 进行备份的示例命令:ETCDCTL_API=3 etcdctl snapshot save --endpoints=。其中 是备份文件的名称, 是 etcd 集群的端点地址。
    • 备份文件将保存在 etcdctl 命令运行的当前目录中。
  2. 恢复 etcd 数据:
    • 登录到运行 etcd 的主节点或任意 etcd 成员节点。
    • 停止 kube-apiserver 服务。
    • 删除 etcd 数据目录。默认情况下,etcd 数据目录位于 /var/lib/etcd。
    • 使用 etcdctl 进行数据恢复。以下是使用 etcdctl 进行恢复的示例命令:ETCDCTL_API=3 etcdctl snapshot restore --data-dir= --initial-cluster= --initial-cluster-token= --initial-advertise-peer-urls=。其中 是备份文件的名称, 是 etcd 数据目录的路径, 是 etcd 集群的初始配置, 是集群令牌, 是 etcd 成员节点的地址。
    • 启动 kube-apiserver 服务。

??请注意,进行 etcd 备份和恢复时需要小心操作,确保备份文件的完整性和一致性,并在恢复之前备份现有的数据以防止数据丢失。此外,etcd 的版本和配置也可能会影响备份和恢复的具体步骤,请参考官方文档或相关资源以获取更详细的信息。

Velero备份恢复准备工作

安装minio

minio在这里是用来保存velero的备份数据,如果你有其它对象存储服务,也可以用它们来替换minio。minio官网:https://min.io/ ?minio中文网站:http://www.minio.org.cn/

在群辉中部署minio:

# 可参考 https://docs.min.io/docs/minio-docker-quickstart-guide.html
version: '3'
services:
  minio:
    image: minio/minio:latest    
    container_name: minio      
    restart: unless-stopped   
    volumes:   
      - "./minio/data:/data"
      - "./minio/minio:/minio"
      - "./minio/config:/root/.minio"
    environment:  
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
      MINIO_PROMETHEUS_AUTH_TYPE: "public"
      MINIO_ACCESS_KEY: "root"                        # 登录账号
      MINIO_SECRET_KEY: "password"                    # 登录密码
    command: server /data  --console-address ":9090" --address ":9000"
    ports:                              # 映射端口
      - "9000:9000" # 文件上传&预览端口
      - "9090:9090" # 控制台访问端口

登录minio创建Buckets

image.png

安装velero

版本选择

velero版本和k8s版本关系

image.png

高版本velerov12.3出现上述问题,原因是参数名称改变了参考https://github.com/vmware-tanzu/velero/issues/7123https://github.com/vmware-tanzu/velero/releases/v1.10.0版本一下参数变更:
image.png
此处小编将velero版本换为1.9.3,重新执行如下

安装velero

下载:https://github.com/vmware-tanzu/velero/releases
image.png

  • amd64(也称为x86-64或x64)是基于Intel和AMD的64位x86架构,它是目前最常见和广泛使用的桌面和服务器处理器架构。
  • arm64(也称为AArch64)是基于ARM架构的64位处理器架构,主要用于移动设备、嵌入式系统和服务器领域。
wget https://github.com/vmware-tanzu/velero/releases/download/v1.12.3/velero-v1.12.3-linux-amd64.tar.gz

tar -xvf velero-v1.12.3-linux-amd64.tar.gz

# 也可不用将velero移动,后续在解压目录执行
cp velero /usr/local/bin/

# 验证是否安装成功
velero version
# 运行该命令会有部分错误信息,该错误可能是由于Velero服务器未正确安装或配置导致的。确保Velero服务器已成功安装到Kubernetes集群中,并且已正确配置和运行。

配置velero认证环境

创建Velero和minio的凭证

# 使用下述命令创建凭证文件
cat > credentials-velero << eof
[default]
aws_access_key_id = root
aws_secret_access_key = password
eof

# 查看创建文件路径,安装velero会用到
[root@ksmaster21 velero]# pwd
/opt/software/velero
# 凭证路径为/opt/software/velero/credentials-velero

aws_access_key_id和aws_secret_access_key
为安装minio是配置的账号密码,分别对应MINIO_ACCESS_KEY和MINIO_SECRET_KEY

部署velero到Kubernetes集群中

  1. velero部署

aws插件与velero版本对应关系:https://github.com/vmware-tanzu/velero-plugin-for-aws
velero版本换为1.9.3,velero/velero-plugin-for-aws版本v1.5.5
image.png

# https://zhuanlan.zhihu.com/p/557868296
velero install \
   --provider aws \
   --bucket ks-data \
   --use-restic \
   --secret-file /opt/software/credentials-velero \
   --use-volume-snapshots=false \
   --plugins velero/velero-plugin-for-aws:v1.5.5 \
   --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.31.3:9000

# 指定命名空间默认velero
--namespace velero \
# 尝试执行添加如下内容
   --dry-run -o yaml > velero.yaml

这是一个用于安装Velero并配置AWS作为备份提供商的命令。下面是对每个选项的解释:

  • –provider aws: 指定Velero的备份提供商为AWS,这将配置Velero以使用AWS提供的备份和恢复功能。
  • –bucket ks-data: 指定Velero备份存储桶的名称为"ks-data",这是用于存储备份数据的AWS S3存储桶。
  • –use-restic: 启用Restic备份插件,用于增量备份和恢复数据。Restic是一种轻量级的备份工具,可提供更快的备份和恢复速度。
  • –secret-file /opt/software/velero/credentials-velero: 指定Velero用于访问AWS服务的凭据文件的路径。该文件应包含访问AWS的凭据信息,如访问密钥和密钥ID。
  • –use-volume-snapshots=false: 禁用使用卷快照进行备份的功能。这意味着Velero将不会使用卷快照来备份数据,而是使用其他备份方法。
  • –plugins velero/velero-plugin-for-aws:v1.0.0: 指定要安装的Velero插件。在此命令中,安装了名为"velero-plugin-for-aws"的插件,并指定了版本为"v1.0.0"。该插件提供了与AWS相关的备份和恢复功能。
  • –namespace velero-system:velero部署到的命名空间,会自动创建命名空间
  • –backup-location-config region=minio,s3ForcePathStyle=“true”,s3Url=http://192.168.31.3:9000: 配置Velero备份位置的详细信息。在此命令中,备份位置设置为使用MinIO对象存储服务,MinIO的URL为"http://192.168.31.3:9000",并指定了存储桶的区域为"minio"。s3ForcePathStyle选项设置为"true",以指示使用路径样式的S3 URL。

通过执行此命令,Velero将被安装并配置为使用AWS作为备份提供商,将备份数据存储在指定的S3存储桶中。使用Restic插件进行增量备份,并配置备份位置为MinIO对象存储服务。

image.png

高版本velero出现上述问题,原因是参数名称改变了参考https://github.com/vmware-tanzu/velero/issues/7123
image.png
此处小编将velero版本换为1.9.2,重新执行显示如下内内容表示成功

Velero is installed! ? Use 'kubectl logs deployment/velero -n velero-system' to view the status.
  1. 验证velero部署
$ kubectl get pod -n velero-system

NAME                     READY   STATUS              RESTARTS   AGE
restic-7hsck             1/1     Running             0          52s
restic-jbx2v             0/1     ContainerCreating   0          52s
restic-kf8p2             0/1     ContainerCreating   0          52s
restic-m87bf             1/1     Running             0          52s
restic-ntq2b             0/1     ContainerCreating   0          52s
velero-fbf774ff4-6c4h6   0/1     Init:0/1            0          52s

image.png

卸载velero

如果您想从集群中完全卸载Velero,则以下命令将删除由velero install创建的所有资源:

# 查看资源确定删除资源
kubectl get crds -l component=velero
kubectl get clusterrolebindings.rbac.authorization.k8s.io | grep velero


# 删除velero
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero

Velero用法

常用Velero命令

以下是一些常用的Velero命令,并以表格形式输出:

命令描述
velero install安装Velero到Kubernetes集群
velero create backup创建备份,将指定的资源对象备份到备份存储位置
velero delete backup删除备份
velero restore恢复备份,将指定的备份还原到Kubernetes集群中
velero get backups获取备份列表
velero describe backup查看备份的详细信息
velero get restores获取恢复列表
velero describe restore查看恢复的详细信息
velero schedule create创建备份调度任务,定期自动执行备份操作
velero schedule get获取备份调度任务列表
velero schedule delete删除备份调度任务
velero plugin add添加Velero插件,用于扩展Velero功能
velero plugin list列出已安装的Velero插件
velero version查看Velero版本信息
velero logs查看Velero组件的日志

备份namespace

备份命令模板:

# 备份持久数据需添加--default-volumes-to-restic
velero backup create <备份名称> --include-namespaces <命名空间名称> --default-volumes-to-restic

# 上述是备份单个namespace,备份整个k8s如下
velero backup create <backup-name> --include-namespaces=<namespace1,namespace2,...> --default-volumes-to-restic
# 建议单个namespace备份还原

backup选项:

  • –exclude-namespaces stringArray : 要从备份中排除的名称空间
  • –incremental 表示创建一个增量备份
  • –exclude-resources stringArray: 要从备份中排除的资源,如storageclasses.storage.k8s.io
  • –include-cluster-resources optionalBool[=true]: 包含集群资源类型
  • –include-namespaces stringArray: 要包含在备份中的名称空间(默认’*')
  • –include-resources stringArray: 备份中要包括的资源
  • –labels mapStringString: 给这个备份加上标签
  • -o, --output string: 指定输出格式,支持’table’、‘json’和’yaml’;
  • -l, --selector labelSelector: 对指定标签的资源进行备份
  • –snapshot-volumes optionalBool[=true]: 对 PV 创建快照
  • –storage-location string: 指定备份的位置
  • –ttl duration: 备份数据多久删掉
  • –volume-snapshot-locations strings: 指定快照的位置,也就是哪一个公有云驱动
  • –default-volumes-to-restic:指示 Velero 在备份过程中使用 Restic 来备份默认卷。Restic 是一个用于备份和还原 Kubernetes 资源的工具,它可以提供更灵活的备份和还原选项。

执行备份操作会在minio中生成如下目录:
image.png
在 Velero 备份过程中,生成的 backups、restic 和 restores 目录分别存放着不同的数据和信息。

  1. backups 目录:
    • backups 目录存放着 Velero 创建的备份文件。每个备份都是一个独立的目录,其中包含了备份的资源和状态信息。这些备份文件通常包括 Kubernetes 资源清单(如 Deployment、Pod、Service 等)以及其他与备份相关的元数据。这些备份文件通常以压缩的 tar 形式存储,并命名为 .tar.gz。
  2. restic 目录:
    • restic 目录是 Velero 与 Restic 集成时使用的目录。Restic 是一个用于备份和恢复数据的开源工具。当 Velero 使用 Restic 进行备份时,它会将数据存储在 restic 目录中。此目录通常包含备份的数据块和索引文件。这些数据文件通常以对象存储的形式进行存储,例如 Amazon S3 或其他支持的对象存储。
  3. restores 目录:
    • 该目录存储 Velero 创建的恢复点(restore point)文件。当您使用 Velero 进行恢复操作时,它会创建一个恢复点文件,其中包含要还原的资源清单、恢复的状态以及与恢复操作相关的元数据。这些恢复点文件通常以压缩的 tar 形式存储,并命名为 .tar.gz。

定时备份

# 使用cron表达式备份,每天的凌晨 1 点备份
$ velero schedule create <备份计划的名称> --schedule="0 1 * * *" --include-namespaces <备份的namespace>
 
# 使用一些非标准的速记 cron 表达式:--schedule="@daily"

 
# 手动触发定时任务
$ velero backup create --from-schedule nginx-daily

–schedule更多cron示例请参考:cron package’s documentation
–schedule=“@daily” 参数表示备份计划将在每天的午夜(00:00)执行备份操作。这是一种简化的调度时间表表示法,用于指定每天的固定时间执行备份。
在使用 --schedule=“@daily” 参数时,不需要指定具体的小时和分钟。它等效于 --schedule=“0 0 * * *”,表示每天的午夜(00:00)执行备份。
这个参数可以方便地创建每天固定时间执行备份的计划,而不必关注具体的小时和分钟设置。如果您希望每天在固定时间进行备份操作,–schedule=“@daily” 是一个简单且方便的选项。

删除备份

# 删除备份,删除多个空格隔开
velero backup delete <backup-name>
# 组合命令删除全部备份
velero backup get -o jsonpath='{.items[*].metadata.name}' | xargs -n 1 velero backup delete

以下是 velero backup delete 命令的所有参数以表格形式输出:

参数描述
–all删除所有备份。
–confirm在执行删除操作之前进行确认。
–dry-run执行模拟运行,不实际删除备份。
–selector根据资源选择器删除符合条件的备份。
–all-namespaces删除所有命名空间中的备份。
–all-resources删除备份中的所有资源类型。
–kubeconfig指定用于访问 Kubernetes 集群的 kubeconfig 文件的路径。
–kubecontext指定要使用的 Kubernetes 集群上下文的名称。
–log-level设置日志级别。可选值:panic、fatal、error、warn、info、debug。
–namespace限定删除操作在指定的命名空间中执行。
–wait等待删除操作完成后再返回。
–timeout设置等待删除操作完成的超时时间。默认为 5m(5 分钟)。

备份高级应用场景介绍

  1. 备份分全量和增量备份,全量备份整个k8s集群可以防止k8s崩溃恢复,后续只需增量备份
  2. 编写脚本可定时备份mysql等数据,通过封装脚本操作和minio可开发容灾恢复平台

使用velero迁移k8s集群

使用velero备份k8s集群

备份环境要求

  1. 迁移项目最好保证两个Kubernetes集群版本一致。
  2. 为了保证PV数据成功迁移,两边需要安装好相同名字的StorageClass。
  3. 可以自己部署Minio,也可以使用公有云的对象存储服务,如华为的OBS、阿里的OSS等。

备份Storageclass

  1. 查看Storageclass
# kubectl get storageclass

NAME                   PROVISIONER                                       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client (default)   cluster.local/nfs-client-nfs-client-provisioner   Delete          Immediate           false                  19d
rook-ceph-block        rook-ceph.rbd.csi.ceph.com                        Delete          Immediate           true                   5d1h

  1. 备份Storageclass
kubectl get sc <storageclassname> -o yaml >  <storageclassname>.yaml

kubectl get sc nfs-client -o yaml > nfs-client-storageclass.yaml
kubectl get sc rook-ceph-block -o yaml > rook-ceph-block-storageclass.yaml
  1. 拷贝Storageclass到待恢复的k8s集群
scp -r <storageclassname>.yaml root@192.168.0.8:/root/
  1. 待恢复的k8s集群还原storageclass
kubectl apply -f <storageclassname>.yaml

备份k8s集群所有namespace

  1. 查看namespace
[root@ksmaster21 velero-v1.9.3-linux-amd64]# kubectl get namespaces
NAME                              STATUS   AGE
argocd                            Active   19d
base                              Active   19d
cert-manager                      Active   14d
default                           Active   19d
dev                               Active   12d
devops                            Active   12d
devopskf4zz                       Active   12d
halo                              Active   25h
kube-node-lease                   Active   19d
kube-public                       Active   19d
kube-system                       Active   19d
kubekey-system                    Active   19d
kubesphere-controls-system        Active   19d
kubesphere-devops-system          Active   19d
kubesphere-devops-worker          Active   19d
kubesphere-logging-system         Active   19d
kubesphere-monitoring-federated   Active   19d
kubesphere-monitoring-system      Active   19d
kubesphere-system                 Active   19d
nacos                             Active   24h
pro                               Active   12d
registry-proxy                    Active   7d3h
rook-ceph                         Active   6d21h
test                              Active   13d
tidb                              Active   3d14h
tidb-admin                        Active   2d15h
tidb-cluster                      Active   2d15h
velero-system                     Active   36m
weave                             Active   19d

备份内容主要分为三部分:

  1. 备份k8s kube-system:无需备份pv持久卷
  2. 备份kubesphere:kubesphere-system备份pv持久卷,插件无需备份pv持久卷,kubesphere日志插件建议使用外部存储,日志占用大量存储空间,外部存储就不用备份pv
  3. 备份企业空间项目:需备份pv持久卷
  1. 备份namespace

执行如下备份命令:(要备份PV时间比较久,耐心等待)

# 备份k8s kube-system
velero backup create kube-system-bak --include-namespaces kube-system

# 备份kubesphere
velero backup create kubesphere-system-bak --include-namespaces kubesphere-system --default-volumes-to-restic && \
velero backup create kubesphere-controls-system-bak --include-namespaces kubesphere-controls-system  && \
velero backup create kubesphere-monitoring-system-bak --include-namespaces kubesphere-monitoring-system  && \
velero backup create kubesphere-monitoring-federated-bak --include-namespaces kubesphere-monitoring-federated  && \
velero backup create kubesphere-logging-system-bak --include-namespaces kubesphere-logging-system  && \
velero backup create kubesphere-devops-system-bak --include-namespaces kubesphere-devops-system  && \
velero backup create argocd-bak --include-namespaces argocd   && \
velero backup create kubesphere-devops-worker-bak --include-namespaces kubesphere-devops-worker  && \
velero backup create weave-bak --include-namespaces weave 
# 备份企业空间项目
velero backup create cert-manager-bak --include-namespaces cert-manager --default-volumes-to-restic  && \
velero backup create registry-proxy-bak --include-namespaces registry-proxy --default-volumes-to-restic  && \
velero backup create base-bak --include-namespaces base  --default-volumes-to-restic && \
velero backup create tidb-admin-bak --include-namespaces tidb-admin --default-volumes-to-restic  && \
velero backup create tidb-cluster-bak --include-namespaces tidb-cluster  --default-volumes-to-restic && \
velero backup create rook-ceph-bak --include-namespaces rook-ceph --default-volumes-to-restic

image.png
image.png

  1. 查看备份列表
# 查看备份列表,状态为Completed表示完成Completed
velero backup get

image.png

  1. 查看备份详情
# 查看备份详情
velero backup describe <备份名称>
  1. 查看备份日志
velero backup logs <备份名称>
  1. 登入minio控制台查看备份内容

image.png

使用velero还原k8s集群

准备工作

  1. 使用kubekey快速安装k8s集群,2. 云原生实战之kubesphere搭建
  2. 在k8s集群中安装velero
  3. 若master需要调度需修改污点(比如rook-ceph用到了master)

这个命令是使用 kubectl 工具来修改节点的污点(Taint)。让我来逐步解释每个部分的含义:

kubectl taint nodes master-restore node-role kubernetes.io/master:Noschedule-lnode/master-restore untainted
  • kubectl taint nodes:这是 kubectl 命令的一部分,用于操作节点的污点。
  • master-restore:这是节点的名称,表示要对名为 master-restore 的节点进行操作。
  • node-role:这是污点的键(key),用于标识污点的目的。在这种情况下,node-role 可能是自定义的键,用于指示节点的角色。
  • kubernetes.io/master:Noschedule-lnode/master-restore:这是污点的值(value),用于进一步描述污点的属性。在这种情况下,kubernetes.io/master:Noschedule-lnode/master-restore 是一个示例值,可能表示节点是主节点(master)且不允许调度(Noschedule)。
  • untainted:这是要应用于节点的新值,用于移除现有的污点。通过指定 untainted,命令将删除节点上与指定键和值匹配的污点。

因此,该命令的目的是将名为 master-restore 的节点上与 node-role 键和 kubernetes.io/master:Noschedule-lnode/master-restore 值匹配的污点移除,使该节点不再受该污点的限制。这样,其他 Pod 将可以在该节点上调度和运行。

确认还原顺序

大致还原顺序如下:

  1. 还原kube-system
  2. 还原storageclass
  3. 还原kubesphere
  4. 还原企业空间项目

还原kubesphere-system和kubesphere-system顺序必须在第一和第二

# 查看备份
velero backup get | grep -w bak

还原kube-system

  1. 还原备份
# 查看备份信息
velero backup get

# 还原
velero restore create --from-backup kube-system-bak

image.png

可执行截图中红色提示命令查看恢复日志和详情

  1. #查看恢复信息
# STATUS为Completed表示完成恢复
velero restore get 

velero restore get 命令用于列出当前集群中的恢复操作。当你使用 Velero 进行备份并希望恢复数据时,可以使用该命令来查看已经执行的恢复操作的状态和详细信息。
执行该命令后,你将看到一个表格,其中包含以下列:

  • NAME:恢复操作的名称。
  • BACKUP:关联的备份的名称。
  • STATUS:恢复操作的当前状态,如 InProgress(进行中)、Completed(已完成)或 Failed(失败)。
  • WARNINGS:如果有任何警告,将显示警告的数量。
  • ERRORS:如果有任何错误,将显示错误的数量。
  • CREATED:恢复操作创建的时间。

通过查看该命令的输出,你可以了解到当前集群中的恢复操作的状态,以及任何可能的警告或错误信息,以便进行故障排除或监视恢复过程。

  1. 查看nfs是否恢复
kubectl get pod -A | grep nfs

image.png

  1. 查看Storageclass是否恢复
# 执行结果No resources found表示没有Storageclass
kubectl get storageclass

image.png

还原Storageclass

  1. 还原storageclass 在还原kube-system后,是因为nfs-client-nfs-client-provisioner部署在kube-system空间下:

image.png

  1. 还原storageclass
kubectl apply -f <storageclassname>.yaml

老集群nfs-client-nfs-client-provisioner在kube-system空间下,如下:
image.png

nfs使用的群辉,数据在集群外,新集群还原使用的是老集群已有的数据
rook-ceph在集群内,这儿恢复会有问题,可将老集群硬盘迁移至新集群

还原kubesphere-system

  1. 还原kubesphere-system
# 查看备份信息
velero backup get

# 还原
velero restore create --from-backup kubesphere-system-bak
  1. 查看恢复信息
velero restore get 
  1. 查看pod情况
# 通过下述命令观察错误pod
kubectl get pods -A
# 通过下述命令查看pod详情信息
kubectl describe pod <pod-name> -n <namespace>

查看可能会出现很多异常情况,异常是因为组件之间可能有依赖情况,此处耐心等待所有组件恢复

  1. 验证是否能登录kubesphere控制台

image.png

注意恢复还原后密码不是原来密码,重置为了kubesphere安装时的初始密码P@w0rd

还原kubesphere插件

velero restore create --from-backup kubesphere-controls-bak  && \
velero restore create --from-backup kubesphere-monitoring-bak && \
velero restore create --from-backup kubesphere-monitoring-federated-bak && \
velero restore create --from-backup kubesphere-logging-system-bak && \
velero restore create --from-backup kubesphere-devops-system-bak && \
velero restore create --from-backup argocd-bak && \
velero restore create --from-backup kubesphere-devops-worker-bak && \
velero restore create --from-backup weave-bak

还原企业空间项目

还原namespace

  1. 创建企业空间

image.png

  1. 创建项目

image.png

  1. 验证是否还原到创建企业空间项目下
# 还原registry-proxy项目
velero restore create --from-backup registry-proxy-bak

查看控制面板中是在企业空间项目下还原:(验证还原成功)
image.png

  1. 按照上述在kubesphere控制台创建项目,执行下述命令还原
velero restore create --from-backup cert-manager-bak   && \
velero restore create --from-backup registry-proxy-bak   && \
velero restore create --from-backup base-bak   && \
velero restore create --from-backup tidb-admin-bak   && \
velero restore create --from-backup tidb-cluster-bak2   && \
velero restore create --from-backup rook-ceph-bak

验证持久卷数据是否备份

以下验证结论,备份没有备份PV持久数据,原因是在备份时pod还在使用的PV不能进行备份,

验证方式1

在老集群创建mysql并修改数据,新集群恢复后查看。在原来集群dev项目下mysql中创建了test表如下:
image.png
备份集群查看mysql如下:
image.png

验证方式2

查看持久卷声明,新旧集群持久卷yaml中使用nfs路径如下,发现新集群没有用老集群持久卷

/volume5/ks/kubesphere-system-minio-pvc-b1b26a83-29b2-4361-8849-3b8d7784eb80 
/volume5/ks/kubesphere-system-minio-pvc-f07441d5-3a35-4074-aada-3a0024e1c4ce

image.png

验证方式3

删除老集群中删除mysql通过velero恢复查看数据
image.png

验证方式4
  1. 查看企业空间是否恢复(企业空间不会恢复)

image.png

  1. 验证应用路由(恢复了应用路由,但是网关地址没有)

image.png

  1. 验证项目网关配置(未恢复网关配置)

image.png
查看eip资源

[root@ks41 eip]# kubectl get eip
error: the server doesn't have a resource type "eip"

发现没有,参考4. 云原生之kubesphere基础服务搭建安装

此处可能会遇到openelb恢复失败的情况,通过下述命令删除,然后通过应用商店安装

kubectl get clusterroles --show-labels -A | grep open

kubectl get clusterroles --show-labels -A | grep open | awk '{print $1}' | xargs kubectl delete clusterrole
  1. kubectl get clusterroles --show-labels -A:获取所有 ClusterRole 资源,并显示它们的标签。
  2. grep open:在结果中过滤出包含 “open” 的行。
  3. awk ‘{print $1}’:提取出每行的第一个字段,即 ClusterRole 的名称。
  4. xargs kubectl delete clusterrole:将 ClusterRole 的名称作为参数传递给 kubectl delete clusterrole 命令,逐个删除这些资源。

请注意,这是一个危险的操作,会直接删除与搜索结果匹配的所有 ClusterRole 资源。在执行此命令之前,请确保您了解其影响,并确保您具有足够的权限来执行删除操作。建议在生产环境中谨慎使用,并先进行适当的测试。

备份恢复持久化数据验证

若想备份持久化数据备份需要添加–default-volumes-to-restic参数

# 备份
velero backup create <备份名称> --include-namespaces <namespace> --default-volumes-to-restic

# 还原
velero restore create --from-backup <备份名称>

老集群mysql数据如下:
image.png
新集群恢复后myql数据如下:
image.png
对比持久卷路径并不一样

/volume5/ks/dev-mysql-dev-pvc-0d3fd22f-4c42-457b-859f-302d08724609
/volume5/ks/dev-mysql-dev-pvc-a855beff-b63f-4a76-8f1f-6c021fbd59bc

由此得出结论,没添加–default-volumes-to-restic是备份元数据,添加后会将持久数据备份到minio

删除之前备份,添加参数重新备份

# 查看备份信息
velero backup get
# 删除备份
velero backup delete <backup-name>
# 组合命令删除全部备份
velero backup get -o jsonpath='{.items[*].metadata.name}' | xargs -n 1 velero backup delete

查看minio备份已删除
image.png

群晖NAS数据同步到云盘

上述操作将k8s数据备份到了minio中,k8s中挂载的数据都是通过群辉NFS进行挂载,即k8s全部数据都在群辉上。考虑到自建服务器稳定性,万一服务器硬件损坏、断电就凉凉了,此时小编将群晖NAS数据同步到网盘上。

WebDAV介绍

WebDAV(Web Distributed Authoring and Versioning)是一种基于HTTP协议的扩展,旨在使用户能够通过网络对远程服务器上的文件进行编辑和管理。它提供了一组用于创建、修改和删除文件的标准方法,并支持文件和文件夹的属性管理。
WebDAV最初是为了解决Web上的协作和文档管理问题而设计的。它扩展了HTTP协议,引入了许多新的方法和头部,以便支持高级文件操作,如锁定文件、复制、移动和重命名文件等。
以下是WebDAV的一些关键功能和特点:

  1. 文件操作:WebDAV通过HTTP方法扩展了文件操作,包括创建、读取、更新和删除文件。它使用URI来标识文件,并通过HTTP请求来执行这些操作。
  2. 文件锁定:WebDAV支持文件级别的锁定机制,以防止多个用户同时编辑同一文件。它使用锁定机制来协调并发编辑操作,确保数据的一致性。
  3. 属性管理:WebDAV允许用户为文件和文件夹定义自定义属性,并通过HTTP头部进行管理。这些属性可以包括元数据、权限信息、版本号等。
  4. 集成性:WebDAV可以与现有的应用程序和协议进行集成,如文件管理器、文档编辑器和版本控制系统等。它提供了标准的接口和方法,使得开发者可以轻松地将WebDAV功能集成到他们的应用中。
  5. 平台无关性:WebDAV是基于HTTP协议的标准扩展,因此它可以在不同的操作系统和平台上使用。无论是Windows、Mac还是Linux,只要支持HTTP协议,就可以使用WebDAV进行文件管理。

WebDAV在许多领域都有广泛的应用,例如在线协作、文档管理、远程文件访问等。它为用户提供了方便的方式来管理和共享文件,同时也为开发者提供了一种标准化的协议来构建和集成文件管理功能。
请注意,WebDAV的功能和特性可能因实现方式和服务器配置而有所不同。具体实现和配置细节可以参考相关的WebDAV服务器文档或规范。

备份到百度网盘

备份相当于将数据上传到百度网盘,上传是很快的,但是从百度网盘下载或者同步到群辉较慢。

  1. 群辉中启动Cloud Sync

image.png
浏览器中登录百度云后,点击上述下一步可检查到登录的百度网盘账号
image.png

  1. 配置备份任务

image.png

  1. 查看备份进度

image.png

  1. 查看备份速度

image.png

备份到阿里云

[新版教程] 阿里云盘通过Docker挂载本地WebDAV实现全自动上传/下载 - 蓝点网

  1. 安装aliyundrive-webdav

aliyundrive-webdav官网github | aliyundrive-webdav refresh token 获取
官网docker安装方式:

docker run -d --name=aliyundrive-webdav --restart=unless-stopped -p 8080:8080 \
  -v /etc/aliyundrive-webdav/:/etc/aliyundrive-webdav/ \
  -e REFRESH_TOKEN='your refresh token' \
  -e WEBDAV_AUTH_USER=admin \
  -e WEBDAV_AUTH_PASSWORD=admin \
  messense/aliyundrive-webdav

改造为docker-compose.yaml

version: '3.1'
services:
  webdav:
    # 注意:请仔细检查下载的镜像,如果下载的是冒充的镜像,可能会导致你的数据泄露
    image: messense/aliyundrive-webdav
    restart: always
    user: root
    container_name: webdav
    ports:
      - "9876:8080"
    volumes:
      - ./aliyundrive-webdav/:/etc/aliyundrive-webdav/
      - /etc/localtime:/etc/localtime
    environment:
	  # 通过获取连接https://messense-aliyundrive-webdav-backendrefresh-token-ucs0wn.streamlit.app
      - REFRESH_TOKEN= 'your refresh token' 
      - WEBDAV_AUTH_USER=admin # webdav的账号
      - WEBDAV_AUTH_PASSWORD=admin # webdav的密码
      # - TZ='Asia/Shanghai'
      # - JAVA_OPTS='-Xms128m -Xmx1024m'

安装:

docker-compose up -d
  1. 验证aliyundrive-webdav是否启动成功
# 查看容器id
docker ps | grep webdav
# 查看日志
docker logs <容器id>

出现如下日志则表示安装启动成功
image.png

  1. 配置阿里云和群辉

在阿里云盘根目录下新建群辉备份数据目录,并上传了[阿里云上文件.txt]
image.png
在群辉nas共享目录下上传了[群辉上文件.txt文件]
image.png

  1. 群辉中启动Cloud Sync,选择WebDAV

image.png

  1. 配置webdav-aliyundriver

image.png

服务器地址:群辉ip+aliyundrive-webdav容器暴露端口
账号密码为安装aliyundrive-webdav设置的

  1. 点击下一步,进入任务配置

image.png

  1. 登录阿里云盘,发现同步了群辉数据

image.png

  1. 查看群辉挂载路径,发现同步了阿里云数据

image.png

其他备份工具

上述是基于群辉Cloudsync里进行数据同步和备份,若想脱离群辉在集群系统上则需安装相应同步软件,这儿介绍几款:

软件名称开发公司主要特点
GoodSyncSiber Systems强大的文件同步和备份工具,支持多种同步方式和丰富的筛选、调度功能
CloudSyncSynology将数据同步到各种云存储服务的应用程序
rsync开源项目命令行工具,支持增量备份、差异传输和压缩等功能。可用于服务器之间的数据同步和备份
SyncBack2BrightSparks强大的文件备份和同步工具,提供灵活的配置选项和多种同步模式
Duplicati开源项目开源备份软件,支持将文件备份到云存储服务,并具有加密和压缩功能
ArqHaystack Software备份工具,可将文件备份到云存储服务,并提供版本控制和恢复功能

阿里云只能查看当前目录大小,只计算了当前目录下文件大小和,不会保护子目录。这儿推荐阿里云盘如何查看整个文件夹大小?

文章来源:https://blog.csdn.net/weixin_45690643/article/details/135669424
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。