使用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搭建和管理企业级网站应用
相关文章
|
1天前
|
Kubernetes 网络安全 Docker
在k8S中,Worker节点加入集群的过程是什么?
在k8S中,Worker节点加入集群的过程是什么?
|
23小时前
|
Kubernetes 固态存储 调度
在K8S中,如何在指定节点上部署Pod呢?
在K8S中,如何在指定节点上部署Pod呢?
|
1天前
|
存储 Kubernetes 监控
在K8S中,worke节点如何加入K8S高可用集群?
在K8S中,worke节点如何加入K8S高可用集群?
|
1天前
|
Kubernetes 网络协议 应用服务中间件
在K8S中,SVC资源是否支持在K8S集群外部访问?
在K8S中,SVC资源是否支持在K8S集群外部访问?
|
1天前
|
存储 Kubernetes 调度
在k8S中,Pod如何实现数据持久化?数据共享?跨节点Pod如何实现数据共享?
在k8S中,Pod如何实现数据持久化?数据共享?跨节点Pod如何实现数据共享?
|
23小时前
|
存储 缓存 Kubernetes
在K8S中,业务Pod数据如何存储?
在K8S中,业务Pod数据如何存储?
|
1天前
|
Kubernetes API 数据库
在K8S中,etcd数据库中数据如何更改?
在K8S中,etcd数据库中数据如何更改?
|
1天前
|
Kubernetes 容器 Perl
在K8S中,请问harbor的secret创建能否直接创建资源清单?
在K8S中,请问harbor的secret创建能否直接创建资源清单?
|
1天前
|
存储 Kubernetes 数据安全/隐私保护
在K8S中,如何下载harbor的私有项目镜像?
在K8S中,如何下载harbor的私有项目镜像?
|
11月前
|
存储 Kubernetes API
在K8S集群中,如何正确选择工作节点资源大小? 2
在K8S集群中,如何正确选择工作节点资源大小?

推荐镜像

更多