使用Velero实现K8S集群资源备份到对象存储COS
2022-02-10 13:10:11 # 运维相关

操作场景

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

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

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

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

image-20220210211239179

另外当执行还原操作时,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:密钥
  1. 在腾讯云 访问管理控制台 新建和获取 COS 授权子账号的腾讯云密钥 SecretIdSecretKey。其中:

    • SecretId 值对应 access_key_id 字段
    • SecretKey 值对应 secret_access_key 字段
  2. 根据上述对应关系,在本地目录创建 Velero 所需的凭证配置文件 credentials-velero,内容如下:

    1
    2
    3
    [default]
    aws_access_key_id=<SecretId>
    aws_secret_access_key=<SecretKey>

安装 Velero

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

    1
    wget https://github.com/vmware-tanzu/velero/releases/download/v1.7.1/velero-v1.7.1-linux-amd64.tar.gz
  2. 执行以下命令解压安装包,安装包提供 Velero 命令行执行文件和一些示例文件。示例如下:

    1
    tar -xvf velero-v1.7.1-linux-amd64.tar.gz
  3. 执行以下命令,将 Velero 可执行文件从解压后的目录迁移到系统环境变量目录下直接使用,本文以迁移至 /usr/bin 目录为例。示例如下:

    1
    mv velero-v1.7.1-linux-amd64/velero /usr/bin/
  4. 执行以下命令安装 Velero ,创建 Velero 和 Restic 工作负载以及其他必要的资源对象(安装参数说明请见 下表)。示例如下:

    1
    2
    3
    4
    5
    6
    7
    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 来关闭存储卷快照备份。执行安装命令之后查看安装过程,如下图所示:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    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.
  5. 安装完成后,等待 Velero 和 Restic 工作负载就绪。执行以下命令,查看配置的存储位置是否可用,若显示 “Avaliable”,则说明集群可正常访问对象存储 COS,如下所示:

    1
    2
    3
    [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
  6. 至此,Velero 安装完成。了解 Velero 更多安装介绍,请参见 Velero 官网文档。

Velero 备份还原测试

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

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    ## 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
  2. 自定义一个nginx默认页面保存到持久卷,后面通过恢复查看效果。

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

    1
    velero backup create test-backup --include-namespaces test

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

    1
    2
    3
    kubectl patch backupstoragelocation default --namespace velero \
    --type merge \
    --patch '{"spec":{"accessMode":"ReadOnly"}}'
  4. 执行以下命令查看备份任务是否完成,当备份任务状态是 “Completed” 且 “ERRORS” 为0时,说明备份任务完成且未发生任何错误。

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

    1
    velero restore create --from-backup test-backup

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

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

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

    1
    2
    3
    kubectl patch backupstoragelocation default --namespace velero \
    --type merge \
    --patch '{"spec":{"accessMode":"ReadWrite"}}'

Velero 卸载

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

1
2
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero

Velero备份常用命令

备份操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#备份集群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

备份恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#从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

查看备份

1
2
3
4
velero  get  backup   #备份查看
velero get schedule #查看定时备份
velero get restore #查看已有的恢复
velero get plugins #查看插件

扩展

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

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

    1
    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中的配置文件为此处的帐号和密码。

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

    1
    2
    3
    4
    5
    6
    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
  3. 后续步骤同上 《Velero 备份还原测试》

总结

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

参考文档

上一页
2022-09-17 13:53:19
下一页