使用Velero备份部署在kubernetes集群中Harbor的数据

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 使用Velero备份部署在kubernetes集群中Harbor的数据

前面在公众号《Harbor进阶实战》中分享了一篇基于docker-compose部署的Harbor备份和还原的文章。

  那么,部署在kubernetes集群中的Harbor服务,如何对Harbor的数据进行备份和恢复呢?

  以下教程展示了如何使用 Velero 备份和恢复已使用 Harbor helm 图表部署在 Kubernetes 集群中的 Harbor 实例。

  • 本教程仅备份 Harbor 资源和数据的一个子集,包括所有与 Harbor 相关的 Kubernetes 资源(部署、StatefulSets、Services、ConfigMap 等)以及 Harbor 内部数据库、注册表、chartmuseum、jobservice 和 Trivy 的 PersistentVolumes 中的数据。
  • Harbor 的 Redis 数据未备份,请参阅限制部分,了解有关对 Harbor 实例的潜在影响的更多详细信息。
  • 本教程中执行的备份是崩溃一致的,而不是应用程序一致的。这意味着恢复后某些数据将丢失,有关详细信息,请参阅限制部分。

一、Velero简介

项目地址:https://github.com/vmware-tanzu/velero

Velero 是Heptio公司(已被VMware收购)采用Go语言开发的开源工具,用于云原生安全地备份和恢复、执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷。

Velero组件

Velero 组件一共分两部分,分别是服务端和客户端。

  • 服务端:部署在Kubernetes集群中;
  • 客户端:是一些运行在本地的命令行的工具,需要已配置好 kubectl 及集群 kubeconfig 的机器上

Velero工作流程

(1)本地 Velero 客户端发送备份指令。

(2)Kubernetes 集群内就会创建一个 Backup 对象。

(3)BackupController 监测 Backup 对象并开始备份过程。

(4)BackupController 会向 API Server 查询相关数据。

(5)BackupController 将查询到的数据备份到远端的对象存储。

Velero特性

Velero 目前包含以下特性:

  • 支持 Kubernetes 集群数据备份和恢复;
  • 支持复制当前 Kubernetes 集群的资源到其它 Kubernetes 集群;
  • 支持复制生产环境到开发以及测试环境;
  • 备份过程中创建的对象是不会备份的;

二、安装Minio存储

使用MinIO存储备份的数据,本处以二进制方式部署单节点的MinIO服务来进行演示。

2.1 下载二进制文件

$ wget -c -k https://dl.min.io/server/minio/release/linux-amd64/minio
$ chmod +x minio
$ mv minio /usr/local/bin/
$ minio  --version
minio version RELEASE.2022-09-22T18-57-27Z (commit-id=20c89ebbb30f44bbd0eba4e462846a89ab3a56fa)
Runtime: go1.18.6 linux/amd64
License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
Copyright: 2015-2022 MinIO, Inc.

2.2 设置环境变量

以环境变量的方式定义MinIO的用户名和密码。

$ export MINIO_ROOT_USER=admin
$ export MINIO_ROOT_PASSWORD=minio123456

2.3 创建数据目录

创建一个目录来存放数据。

$ mkdir -p /data/minio/data

2.4 启动服务

$ minio server --console-address ":8000" /data/minio/data
MinIO Object Storage Server
Copyright: 2015-2023 MinIO, Inc.
License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
Version: RELEASE.2023-04-07T05-28-58Z (go1.20.3 linux/amd64)
Status:         1 Online, 0 Offline. 
API: http://192.168.2.3:9000  http://127.0.0.1:9000     
RootUser: admin 
RootPass: minio123456 
Console: http://192.168.2.3:8000 http://127.0.0.1:8000   
RootUser: admin 
RootPass: minio123456 
Command-line: https://min.io/docs/minio/linux/reference/minio-mc.html#quickstart
   $ mc alias set myminio http://192.168.2.3:9000 admin minio123456
Documentation: https://min.io/docs/minio/linux/index.html
Warning: The standard parity is set to 0. This can lead to data loss.

默认启动的API端口是9000(第三方应用通过该API实现数据的读取),还有一个Web Console的端口,并且Console监听的是一个动态的端口, 可以通过 --console-address ":port" 指定静态端口

2.5 登录MinIO UI

在启动服务时会输出登录的地址、用户名、密码,根据其输出信息在浏览器登录管理界面:

2.6 创建桶(Buckets)

登录管理界面后,可以在Buckets处点击”Create Bucket“创建一个名称为veleroback的存储桶,名称可以自行更改为其他,后面在安装Velero时需要提供该存储桶的名称。


三、安装Velero

3.1 安装 Velero CLI

$ wget https://github.com/vmware-tanzu/velero/releases/download/v1.10.2/velero-v1.10.2-linux-amd64.tar.gz
$ tar -zxvf velero-v1.10.2-linux-amd64.tar.gz 
velero-v1.10.2-linux-amd64/LICENSE
velero-v1.10.2-linux-amd64/examples/.DS_Store
velero-v1.10.2-linux-amd64/examples/README.md
velero-v1.10.2-linux-amd64/examples/minio
velero-v1.10.2-linux-amd64/examples/minio/00-minio-deployment.yaml
velero-v1.10.2-linux-amd64/examples/nginx-app
velero-v1.10.2-linux-amd64/examples/nginx-app/README.md
velero-v1.10.2-linux-amd64/examples/nginx-app/base.yaml
velero-v1.10.2-linux-amd64/examples/nginx-app/with-pv.yaml
velero-v1.10.2-linux-amd64/velero
$ cp velero-v1.10.2-linux-amd64/velero   /usr/local/bin/
$ velero --help

3.2 创建S3访问凭证

创建访问凭证,使Velero可以有权访问Minion存储。

$ cat credentials-velero
[default]
aws_access_key_id = admin    #minio的用户
aws_secret_access_key = minio123456    #minio的密码

3.3 安装Velero服务端

要求Kubernetes v1.16+,因为Helm使用了 CustomResourceDefinition。此 API 版本在 Kubernetes v1.16 中引入apiextensions.k8s.io/v1

首先需要在kubernetes集群中安装Velero。可以使用以下命令来安装:

velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.2.0 \
    --bucket <your-bucket-name> \
    --secret-file ./credentials-velero \
    --backup-location-config  region=minio,s3ForcePathStyle="true",s3Url=<minio-url> \
    --image velero/velero:v1.5.3 \
    --namespace velero
  • --provider aws: 指定Velero使用AWS S3作为备份数据存储的提供者。如果需要使用其他对象存储提供者,可以修改该参数的值。
  • --plugins velero/velero-plugin-for-aws:v1.2.0: 指定Velero需要使用的插件。在这里,指定了使用Velero插件for AWS v1.2.0版本来支持AWS S3的备份存储。
  • --bucket veleroback: 指定Velero备份数据存储的S3存储桶名称。需要提前创建该存储桶,并确保Velero具有足够的权限来访问该存储桶。
  • --secret-file ./credentials-velero: 指定访问S3存储桶所需的凭证文件。该文件应该包含AWS访问密钥和密钥ID等信息。
  • --backup-location-config region=minio,s3ForcePathStyle=: 指定备份数据存储的配置选项。在这里,指定备份数据存储在Minio对象存储中,并设置存储桶的区域为"minio",同时启用S3路径样式访问。Minio的地址需要在前面添加协议,即http://xxx:9000。
# 我的命令:
$ velero install \
--provider aws --plugins velero/velero-plugin-for-aws:v1.2.0 \
--bucket veleroback --secret-file ./credentials-velero \
--backup-location-config  region=minio,s3ForcePathStyle="true",s3Url=http://192.168.2.3:9000  \
--image velero/velero:v1.10.2  --namespace velero-system

3.4 检查服务状态

  • 查看Pod状态
$ kubectl -n velero-system get pod
NAME                      READY   STATUS    RESTARTS   AGE
velero-7d6fdd754c-nnwbv   1/1     Running   0          91s
  • 查看Velero服务日志
$ kubectl logs deployment/velero -n velero-system
  • 查看Velero在kubernetes集群中创建的CRD
$ kubectl -n velero-system get crds -l component=velero
NAME                                CREATED AT
backuprepositories.velero.io        2023-04-09T11:58:38Z
backups.velero.io                   2023-04-09T11:58:38Z
backupstoragelocations.velero.io    2023-04-09T11:58:38Z
deletebackuprequests.velero.io      2023-04-09T11:58:38Z
downloadrequests.velero.io          2023-04-09T11:58:39Z
podvolumebackups.velero.io          2023-04-09T11:58:39Z
podvolumerestores.velero.io         2023-04-09T11:58:39Z
restores.velero.io                  2023-04-09T11:58:39Z
schedules.velero.io                 2023-04-09T11:58:39Z
serverstatusrequests.velero.io      2023-04-09T11:58:39Z
volumesnapshotlocations.velero.io   2023-04-09T11:58:39Z

3.5 卸载Velero(补充)

可以通过以下命令卸载Velero服务。

注意:卸载 Velero 服务器时,所有备份保持不变。

$ velero  uninstall --namespace velero-system
You are about to uninstall Velero.
Are you sure you want to continue (Y/N)? y     #输入y确认卸载
Waiting for velero namespace "velero-system" to be deleted
.............................................................
Velero namespace "velero-system" deleted
Velero uninstalled ⛵

四、备份Harbor

4.1 设置Harbor为“只读”

使用具有 Harbor 系统管理员权限的帐户登录到 Harbor 门户。展开管理,然后选择配置。选择“系统设置”选项卡。

选中“存储库只读”复选框,然后单击“保存”按钮以保存配置。

4.2 备份Harbor

使用以下命令创建Velero备份:

#将命名空间和备份名称替换为您的
$ velero backup create harbor-backup --include-namespaces harbor --snapshot-volumes --wait

其中,harbor-backup是备份名称,harbor是要备份的命名空间。velero存在不同版本备份的命令不一样的问题,可以使用--help查看详细的命令和参数。--namespace指定Velero服务所在的命名空间(不指定则默认为velero)

4.3 查看已有备份资源

$ velero backup get  --namespace velero-system

五、恢复数据

使用以下命令恢复数据:velero restore create --from-backup harbor-backup 其中,harbor-backup是要恢复的备份名称。

验证数据

使用以下命令验证数据是否已成功恢复:

$ kubectl -n harborget pods 
$ kubectl -n harborget pvc
$ kubectl -n harborget configmaps
$ kubectl -n harborget secrets

以上命令将返回Harbor中的所有Pod、PVC、ConfigMap和Secret。如果这些对象已成功恢复,则表示备份和恢复过程已经完成。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
20天前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
109 60
|
21天前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
127 62
|
6天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
7天前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。
|
18天前
|
Kubernetes Ubuntu Linux
Centos7 搭建 kubernetes集群
本文介绍了如何搭建一个三节点的Kubernetes集群,包括一个主节点和两个工作节点。各节点运行CentOS 7系统,最低配置为2核CPU、2GB内存和15GB硬盘。详细步骤包括环境配置、安装Docker、关闭防火墙和SELinux、禁用交换分区、安装kubeadm、kubelet、kubectl,以及初始化Kubernetes集群和安装网络插件Calico或Flannel。
|
19天前
|
NoSQL 关系型数据库 Redis
高可用和性能:基于ACK部署Dify的最佳实践
本文介绍了基于阿里云容器服务ACK,部署高可用、可伸缩且具备高SLA的生产可用的Dify服务的详细解决方案。
|
存储 Kubernetes API
在K8S集群中,如何正确选择工作节点资源大小? 2
在K8S集群中,如何正确选择工作节点资源大小?
|
Kubernetes Serverless 异构计算
基于ACK One注册集群实现IDC中K8s集群以Serverless方式使用云上CPU/GPU资源
在前一篇文章《基于ACK One注册集群实现IDC中K8s集群添加云上CPU/GPU节点》中,我们介绍了如何为IDC中K8s集群添加云上节点,应对业务流量的增长,通过多级弹性调度,灵活使用云上资源,并通过自动弹性伸缩,提高使用率,降低云上成本。这种直接添加节点的方式,适合需要自定义配置节点(runtime,kubelet,NVIDIA等),需要特定ECS实例规格等场景。同时,这种方式意味您需要自行
基于ACK One注册集群实现IDC中K8s集群以Serverless方式使用云上CPU/GPU资源
|
Kubernetes API 调度
在K8S集群中,如何正确选择工作节点资源大小?1
在K8S集群中,如何正确选择工作节点资源大小?
|
弹性计算 运维 Kubernetes
本地 IDC 中的 K8s 集群如何以 Serverless 方式使用云上计算资源
本地 IDC 中的 K8s 集群如何以 Serverless 方式使用云上计算资源