前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Velero实现K8S集群资源备份到对象存储COS

使用Velero实现K8S集群资源备份到对象存储COS

作者头像
Lcry
发布2022-11-29 17:45:11
1.5K0
发布2022-11-29 17:45:11
举报
文章被收录于专栏:Lcry个人博客

操作场景

开源工具 Velero(旧版本名称为 Heptio Ark)可以安全地备份和还原、执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷。在容器服务 TKE 集群或自建 Kubenetes 集群中部署 Velero 可以实现以下功能:

  • 备份集群资源并在丢失的情况下进行还原。
  • 将集群资源迁移到其他集群。
  • 将生产集群资源复制到开发和测试集群。

Velero 工作原理图如下图所示(来源于 Velero 官网),当用户执行备份命令时,备份过程说明如下:

  1. 调用自定义资源 API 创建备份对象(1)。
  2. BackupController 控制器检测到生成的备份对象时(2)执行备份操作(3)。
  3. 将备份的集群资源和存储卷快照上传到 Velero 的后端存储(4)和(5)。
使用Velero实现K8S集群资源备份到对象存储COS
使用Velero实现K8S集群资源备份到对象存储COS

另外当执行还原操作时,Velero 会将指定备份对象的数据从后端存储同步到 Kubernetes 集群完成还原工作。 更多关于 Velero 介绍,请参见 Velero 官网文档。本文将介绍如何使用腾讯云 对象存储 COS 作为 Velero 后端存储实现集群备份和还原。

前提条件

操作步骤

创建存储桶

  1. 对象存储控制台 为 Velero 创建一个对象存储桶用于存储备份,详情请参见 创建存储桶
  2. 为存储桶设置访问权限 。对象存储 COS 支持设置两种权限类型:
    • 公共权限:为了安全起见,推荐存储桶权限类别为私有读写,关于公共权限的说明,请参见存储桶概述中的 权限类别
    • 用户权限:主账号默认拥有存储桶所有权限(即完全控制)。另外 COS 支持添加子账号有数据读取、数据写入、权限读取、权限写入,甚至完全控制的最高权限。 由于需要对存储桶进行读写操作,为示例子账号授予数据读取、数据写入权限,如下图所示:

获取存储桶访问凭证

Velero 使用与 AWS S3 兼容的 API 访问 COS ,需要使用一对访问密钥 ID 和密钥创建的签名进行身份验证,在 S3 API 参数中:

  • access_key_id :访问密钥 ID
  • secret_access_key:密钥

在腾讯云 访问管理控制台 新建和获取 COS 授权子账号的腾讯云密钥 SecretIdSecretKey。其中:

  • SecretId 值对应 access_key_id 字段
  • SecretKey 值对应 secret_access_key 字段

根据上述对应关系,在本地目录创建 Velero 所需的凭证配置文件 credentials-velero,内容如下:

代码语言:javascript
复制
[default]
aws_access_key_id=<SecretId>
aws_secret_access_key=<SecretKey>

安装 Velero

下载 Velero 最新版本安装包到集群环境中,本文以 v1.7.1 版本为例。示例如下:

代码语言:javascript
复制
wget https://github.com/vmware-tanzu/velero/releases/download/v1.7.1/velero-v1.7.1-linux-amd64.tar.gz

执行以下命令解压安装包,安装包提供 Velero 命令行执行文件和一些示例文件。示例如下:

代码语言:javascript
复制
tar -xvf velero-v1.7.1-linux-amd64.tar.gz

执行以下命令,将 Velero 可执行文件从解压后的目录迁移到系统环境变量目录下直接使用,本文以迁移至 /usr/bin 目录为例。示例如下:

代码语言:javascript
复制
mv velero-v1.7.1-linux-amd64/velero /usr/bin/

执行以下命令安装 Velero ,创建 Velero 和 Restic 工作负载以及其他必要的资源对象(安装参数说明请见 下表)。示例如下:

代码语言:javascript
复制
velero install  --provider aws --plugins velero/velero-plugin-for-aws:v1.3.0 --bucket <BucketName> \
--secret-file ./credentials-velero \
--use-restic \
--default-volumes-to-restic \
--use-volume-snapshots=false \
--backup-location-config \
region=ap-guangzhou,s3ForcePathStyle="true",s3Url=https://cos.ap-guangzhou.myqcloud.com

安装参数说明:

安装参数

参数说明

–provider

声明使用 aws 提供的插件类型。

–plugins

使用 AWS S3 兼容 API 插件 “velero-plugin-for-aws”。

–bucket

在对象存储 COS 创建的存储桶名。

–secret-file

访问对象存储 COS 的访问凭证文件,详情参见上述创建的 “credentials-velero” 凭证文件。

–use-restic

Velero 支持使用免费开源备份工具 Restic 备份和还原 Kubernetes 存储卷数据 (不支持 hostPath 卷,详情请参见 Restic 限制),该集成是 Velero 备份功能的补充,建议开启。

–use-volume-snapshots

关闭存储卷快照备份。

–default-volumes-to-restic

启用使用 Restic 来备份所有 Pod 卷,前提是需要开启 --use-restic 参数。

–backup-location-config

备份存储桶访问相关配置,包括 region、s3ForcePathStyle、s3Url 等。

region

兼容 S3 API 的对象存储 COS 存储桶地域,例如创建地域为广州,region 参数值为 “ap-guangzhou”

s3ForcePathStyle

使用 S3 文件路径格式。

s3Url

对象存储 COS 兼容的 S3 API 访问地址。请注意该访问地址中的域名不是上述创建 COS 存储桶的公网访问域名,例如地域为广州,则参数值为 https://cos.ap-guangzhou.myqcloud.com。

其他安装参数可以使用命令 velero install --help 查看。例如,不备份存储卷数据,可以设置 --use-volume-snapshots=false 来关闭存储卷快照备份。执行安装命令之后查看安装过程,如下图所示:

代码语言:javascript
复制
CustomResourceDefinition/backups.velero.io: attempting to create resource
CustomResourceDefinition/backups.velero.io: attempting to create resource client
CustomResourceDefinition/backups.velero.io: created
CustomResourceDefinition/backupstoragelocations.velero.io: attempting to create resource
CustomResourceDefinition/backupstoragelocations.velero.io: attempting to create resource cl                                    ient
CustomResourceDefinition/backupstoragelocations.velero.io: created
CustomResourceDefinition/deletebackuprequests.velero.io: attempting to create resource
CustomResourceDefinition/deletebackuprequests.velero.io: attempting to create resource clie                                    nt
CustomResourceDefinition/deletebackuprequests.velero.io: created
CustomResourceDefinition/downloadrequests.velero.io: attempting to create resource
CustomResourceDefinition/downloadrequests.velero.io: attempting to create resource client
CustomResourceDefinition/downloadrequests.velero.io: created
CustomResourceDefinition/podvolumebackups.velero.io: attempting to create resource
CustomResourceDefinition/podvolumebackups.velero.io: attempting to create resource client
CustomResourceDefinition/podvolumebackups.velero.io: created
CustomResourceDefinition/podvolumerestores.velero.io: attempting to create resource
CustomResourceDefinition/podvolumerestores.velero.io: attempting to create resource client
CustomResourceDefinition/podvolumerestores.velero.io: created
CustomResourceDefinition/resticrepositories.velero.io: attempting to create resource
CustomResourceDefinition/resticrepositories.velero.io: attempting to create resource client
CustomResourceDefinition/resticrepositories.velero.io: created
CustomResourceDefinition/restores.velero.io: attempting to create resource
CustomResourceDefinition/restores.velero.io: attempting to create resource client
CustomResourceDefinition/restores.velero.io: created
CustomResourceDefinition/schedules.velero.io: attempting to create resource
CustomResourceDefinition/schedules.velero.io: attempting to create resource client
CustomResourceDefinition/schedules.velero.io: created
CustomResourceDefinition/serverstatusrequests.velero.io: attempting to create resource
CustomResourceDefinition/serverstatusrequests.velero.io: attempting to create resource clie                                    nt
CustomResourceDefinition/serverstatusrequests.velero.io: created
CustomResourceDefinition/volumesnapshotlocations.velero.io: attempting to create resource
CustomResourceDefinition/volumesnapshotlocations.velero.io: attempting to create resource c                                    lient
CustomResourceDefinition/volumesnapshotlocations.velero.io: created
Waiting for resources to be ready in cluster...
Namespace/velero: attempting to create resource
Namespace/velero: attempting to create resource client
Namespace/velero: created
ClusterRoleBinding/velero: attempting to create resource
ClusterRoleBinding/velero: attempting to create resource client
ClusterRoleBinding/velero: created
ServiceAccount/velero: attempting to create resource
ServiceAccount/velero: attempting to create resource client
ServiceAccount/velero: created
Secret/cloud-credentials: attempting to create resource
Secret/cloud-credentials: attempting to create resource client
Secret/cloud-credentials: created
BackupStorageLocation/default: attempting to create resource
BackupStorageLocation/default: attempting to create resource client
BackupStorageLocation/default: created
VolumeSnapshotLocation/default: attempting to create resource
VolumeSnapshotLocation/default: attempting to create resource client
VolumeSnapshotLocation/default: created
Deployment/velero: attempting to create resource
Deployment/velero: attempting to create resource client
Deployment/velero: created
DaemonSet/restic: attempting to create resource
DaemonSet/restic: attempting to create resource client
DaemonSet/restic: created
Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.

安装完成后,等待 Velero 和 Restic 工作负载就绪。执行以下命令,查看配置的存储位置是否可用,若显示 “Avaliable”,则说明集群可正常访问对象存储 COS,如下所示:

代码语言:javascript
复制
[root@k8s-master velero]# velero backup-location get
NAME      PROVIDER   BUCKET/PREFIX      PHASE       LAST VALIDATED                  ACCESS MODE   DEFAULT
default   aws        <BucketName>   Available   2022-02-10 21:20:46 +0800 CST   ReadWrite     true

至此,Velero 安装完成。了解 Velero 更多安装介绍,请参见 Velero 官网文档。

Velero 备份还原测试

创建一个具有持久卷的 Nginx 测试服务,在此示例中,已经为 Nginx 服务打开了NodePort端口,可以在浏览器中使用端口地址访问管理页面。

代码语言:javascript
复制
## velero测试nginx部署
---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    k8s.kuboard.cn/displayName: nginx
  labels:
    k8s.kuboard.cn/layer: web
    k8s.kuboard.cn/name: nginx
  name: nginx
  namespace: test
spec:
  selector:
    matchLabels:
      k8s.kuboard.cn/layer: web
      k8s.kuboard.cn/name: nginx
  template:
    metadata:
      labels:
        k8s.kuboard.cn/layer: web
        k8s.kuboard.cn/name: nginx
    spec:
      containers:
        - image: 'nginx:latest'
          imagePullPolicy: IfNotPresent
          name: container
          ports:
            - containerPort: 80
              name: port
              protocol: TCP
          resources: {}
          volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: volume-afffh
      restartPolicy: Always
      volumes:
        - name: volume-afffh
          persistentVolumeClaim:
            claimName: nginx-demo
---
apiVersion: v1
kind: Service
metadata:
  annotations: {}
  labels:
    k8s.kuboard.cn/layer: web
    k8s.kuboard.cn/name: nginx
  name: nginx
  namespace: test
spec:
  ports:
    - name: ed5qwb
      nodePort: 30005
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    k8s.kuboard.cn/layer: web
    k8s.kuboard.cn/name: nginx
  sessionAffinity: None
  type: NodePort

自定义一个nginx默认页面保存到持久卷,后面通过恢复查看效果。

使用 Velero 备份,可以直接备份集群中的所有对象,也可以按类型,名称空间和/或标签过滤对象。您可以执行以下命令仅备份 test 命名空间下所有资源。示例如下:

代码语言:javascript
复制
velero backup create test-backup --include-namespaces test

备份完成后暂时将权限设置为只读模式:

代码语言:javascript
复制
kubectl patch backupstoragelocation default --namespace velero \
    --type merge \
    --patch '{"spec":{"accessMode":"ReadOnly"}}'

执行以下命令查看备份任务是否完成,当备份任务状态是 “Completed” 且 “ERRORS” 为0时,说明备份任务完成且未发生任何错误。

代码语言:javascript
复制
velero backup get

执行以下命令,使用上述 Velero 创建的备份 “test-backup” 来创建还原任务。示例如下:

代码语言:javascript
复制
velero restore create --from-backup test-backup

通过命令 velero restore get 查看还原任务的状态,若还原状态是 “Completed” 且 “ERRORS” 为0时,则说明还原任务完成。

还原完成后,执行以下命令,可以查看到之前被删除的 Nginx 相关资源已经还原成功。

另外在还原完成后,可以执行以下命令,将备份存储位置恢复为读写模式,以便在下次可以正常备份。示例如下:

代码语言:javascript
复制
kubectl patch backupstoragelocation default --namespace velero \
            --type merge \
            --patch '{"spec":{"accessMode":"ReadWrite"}}'

Velero 卸载

执行以下命令,可以在集群中卸载 Velero。示例如下:

代码语言:javascript
复制
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero

Velero备份常用命令

备份操作

代码语言:javascript
复制
#备份集群ingress-nginx namespace下资源:
velero backup create ingress-nginx-backup --include-namespaces ingress-nginx

#查看备份结果
velero backup describe ingress-nginx-backup
velero backup logs ingress-nginx-backup

#删除备份
velero delete backup ingress-nginx-backup

#备份非ingress-nginx和test命名空间下的资源:
velero backup create k8s-full-test-backup --exclude-namespaces ingress-nginx,test

#备份特定资源类型
velero backup create kube-system-backup --include-resources pod,secret

#--confirm 直接删除备份,无需确认:
velero backup delete kube-system-backup --confirm

#备份带pv pod
velero backup create pvc-backup  --snapshot-volumes --include-namespaces test-velero

备份恢复

代码语言:javascript
复制
#从backup创建restore
velero restore create ${RESTORE_NAME} --from-backup ${BACKUP_NAME}

# 从backup创建restore,restore默认名为 ${BACKUP_NAME}-<timestamp>
velero restore create --from-backup ${BACKUP_NAME}

# 从schedule最新一次的backup创建restore
velero restore create --from-schedule ${SCHEDULE_NAME}

# 指定backup中的某些资源创建restore
velero restore create --from-backup backup-2 --include-resources pod,secret

# 恢复集群所有备份,(对已经存在的服务不会覆盖)
velero restore create --from-backup all-ns-backup

# 仅恢复default nginx-example命名空间
velero restore create --from-backup all-ns-backup --include-namespaces default,nginx-example 

# 将test-velero 命名空间资源恢复到test-velero-1下面
velero restore create restore-for-test --from-backup everyday-1-20210203131802 --namespace-mappings test-velero:test-velero-1

查看备份

代码语言:javascript
复制
velero  get  backup   #备份查看
velero  get  schedule #查看定时备份
velero  get  restore  #查看已有的恢复
velero  get  plugins  #查看插件

扩展

若需要备份到自建的Minio存储中,使用下面步骤:

docker快速部署minio,部署成功访问 http://localhost:19001,默认帐号密码:minioadmin/minioadmin

代码语言:javascript
复制
docker run -d --name minio-server -e MINIO_ROOT_USER=miniouser -e MINIO_ROOT_PASSWORD=miniopasswd -v /root/minio/data:/data -p 19000:9000 -p 19001:9001 minio/minio server /data --console-address ":9001"

这里通过环境变量设置管理员的帐号和密码,同时需要更新credentials-velero中的配置文件为此处的帐号和密码。

修改部署verlero安装命令如下:

代码语言:javascript
复制
velero install  --provider aws --plugins velero/velero-plugin-for-aws:v1.3.0 --bucket <MINIO自建的BucketName>  \
--secret-file ./credentials-velero \
--use-restic \
--default-volumes-to-restic \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio部署地址:19000

后续步骤同上 《Velero 备份还原测试》

总结

本文主要介绍 Kubernetes 集群资源备份工具 Velero,展示了如何配置腾讯云 COS 对象存储来作为 Velero 的后端存储,并成功实践服务资源和数据的备份和还原操作,最后扩展了使用自己的Minio作为后端存储实现自建备份。

参考文档

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 操作场景
  • 前提条件
  • 操作步骤
    • 创建存储桶
      • 获取存储桶访问凭证
        • 安装 Velero
          • Velero 备份还原测试
            • Velero 卸载
            • Velero备份常用命令
              • 备份操作
                • 备份恢复
                • 查看备份
                • 扩展
                • 总结
                • 参考文档
                相关产品与服务
                对象存储
                对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档