来自群友

前言:

  1. 一般来说大家都用etcd备份恢复k8s集群,但是有时候我们可能误操删掉了一个namespace,假设这个namespaces 里面有上百个服务,瞬间没了,怎么办?

velero可以帮助我们:
灾备场景,提供备份恢复k8s集群的能力
迁移场景,提供拷贝集群资源到其他集群的能力(复制同步开发,测试,生产环境的集群配置,简化环境配置)
下面我就介绍一下如何使用 Velero 完成备份和迁移。

  1. Velero 地址:https://github.com/vmware-tanzu/velero
  2. ACK 插件地址:https://github.com/AliyunContainerService/velero-plugin

Velero 是 VMWare 开源的 k8s 集群备份、迁移工具。可以帮助我们完成 k8s 的例行备份工作,以便在出现上面问题的时候可以快速进行恢复。同时也提供了集群迁移功能,可以将 k8s 资源迁移到其他 k8s 集群的功能。Velero 将集群资源保存在对象存储中,默认情况下可以使用 AWS、Azure、GCP 的对象存储,同时也给出了插件功能用来拓展其他平台的存储,这里我们用到的就是阿里云的对象存储 OSS,阿里云也提供了 Velero 的插件,用于将备份存储到 OSS 中。下面我就介绍一下如何在阿里云容器服务 ACK 使用 Velero 完成备份和迁移。

Velero 工作原理

Velero 首先会在集群中创建各种 CRD 以及相关的控制器,通过对 CRD 对象的操作完成备份、恢复行为。Velero 的工作原理图如下:
13.8、使用Velero进行集群备份、恢复与迁移 - 图1

  1. Velero 客户端调用 Kubernetes API 服务器创建 Backup 对象。
  2. BackupController 监听 Backup 对象变化,以执行备份过程。
  3. 备份时,BackupController 通过 API Server 查询相关数据。
  4. 备份后,BackupController 将数据上传到对象存储。

安装 Velero 服务

Velero 由客户端和服务端组成,服务器部署在目标 k8s 集群上,而客户端则是运行在本地的命令行工具。
前往 Velero 的 Release 页面 下载客户端,直接在 GitHub 上下载即可

  1. [root@k8s-master-01 ~]# wget https://github.com/vmware-tanzu/velero/releases/download/v1.4.0/velero-v1.4.0-linux-amd64.tar.gz

解压 release 包

  1. [root@k8s-master-01 ~]# tar xf velero-v1.4.0-linux-amd64.tar.gz

将 release 包中的二进制文件 velero 移动到 $PATH 中的某个目录下,(一般情况 /usr/local/bin/ )

  1. [root@k8s-master-01 ~]# mv velero /usr/local/bin/
  2. [root@k8s-master-01 ~]# ls /usr/local/bin/velero
  3. /usr/local/bin/velero

执行 velero -h 测试
13.8、使用Velero进行集群备份、恢复与迁移 - 图2

创建 OSS bucket

创建一个 OSS bucket 用于存储备份文件,这里也可以用已有的 bucket,之后会在 bucket 中创建 test 目录,这里建议在已有的 bucket 中创建一个子目录用于存储备份文件。
创建 OSS Bucket 过程~~~~
创建 OSS 的时候一定要选对区域,要和 ACK 集群在同一个区域,存储类型和读写权限选择标准存储和私有:
13.8、使用Velero进行集群备份、恢复与迁移 - 图3

创建阿里云 RAM 用户

用于操作 OSS 以及 ACK 资源,新建权限策略,
13.8、使用Velero进行集群备份、恢复与迁移 - 图4
策略内容:(进行测试时)

  1. {
  2. "Version": "1",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": "oss:*",
  7. "Resource": [
  8. "acs:oss:*:*:pps-k8s-backup/*",
  9. "acs:oss:*:*:pps-k8s-backup"
  10. ]
  11. }
  12. ]
  13. }

在新建用户的时候要选择 编程访问,来获取 AccessKeyID 和 AccessKeySecret。
13.8、使用Velero进行集群备份、恢复与迁移 - 图5

部署服务端

  • 拉取 Velero 插件 :

    1. git clone https://github.com/AliyunContainerService/velero-plugin
  • 修改配置:
    修改 install/credentials-velero 文件,
    将新建用户中获得的 AccessKeyID 和 AccessKeySecret 填入,这里的 OSS EndPoint 为之前 OSS 的访问域名(注:这里需要选择外网访问的 EndPoint。)
    13.8、使用Velero进行集群备份、恢复与迁移 - 图6

    1. [root@k8s-master-01 velero-plugin]# more install/credentials-velero
    2. ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
    3. ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
    4. ALIBABA_CLOUD_OSS_ENDPOINT=<ALIBABA_CLOUD_OSS_ENDPOINT>
  • 修改 install/01-velero.yaml,将 OSS 配置填入: ```


apiVersion: velero.io/v1 kind: BackupStorageLocation metadata: labels: component: velero name: default namespace: velero spec: config: region: cn-shenzhen # 地域 如果是深圳 变为 cn-shenzhen objectStorage: bucket: pps-k8s-backup # OSS bucket 名称 prefix: “test” # bucket 子目录,也就是说存放备份数据的目录

provider: alibabacloud

apiVersion: velero.io/v1 kind: VolumeSnapshotLocation metadata: labels: component: velero name: default namespace: velero spec: config: region: cn-shenzhen # 地域 如果是深圳 变为 cn-shenzhen provider: alibabacloud

  1. - k8s 部署 Velero 服务
  2. <a name="yV0ZD"></a>
  3. ##### 新建 namespace

kubectl create namespace velero

  1. <a name="Tga7b"></a>
  2. ##### 部署 credentials-velero 的 secret

kubectl create secret generic cloud-credentials —namespace velero —from-file cloud=install/credentials-velero

  1. <a name="ybAsr"></a>
  2. ##### 部署 CRD

kubectl apply -f install/00-crds.yaml

  1. <a name="iKPhk"></a>
  2. ##### 部署 Velero

kubectl apply -f install/01-velero.yaml

  1. - 测试 Velero 状态

[root@k8s-master-01 velero-plugin]# velero version Client: Version: v1.4.0 Git commit: 5963650c9d64643daaf510ef93vc4a46b6283392 Server: Version: v1.2.0

  1. 可以看到 Velero 的客户端和服务端已经部署成功。
  2. - 服务端清理
  3. 在完成测试或者需要重新安装时,执行如下命令进行清理:

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

  1. <a name="DRvCp"></a>
  2. #### 备份测试

[root@k8s-master-01 velero-plugin]# kubectl get pods -n panshi-qtc-dev panshi-qtc-dev panshi-api3rd-server-7cdb88b4c7-dp7f5 1/1 Running 0 5d1h panshi-qtc-dev panshi-contract-server-7dc4544966-bxlp7 1/1 Running 0 4d23h panshi-qtc-dev panshi-pdf-server-7774fc6c48-ljr7j 1/1 Running 0 5d22h panshi-qtc-dev panshi-storage-server-75b88b8bdf-7f4js 1/1 Running 0 5d1h panshi-qtc-dev panshi-system-server-7fc894cbff-hxxq9 1/1 Running 0 4d23h

  1. - 使用 velero panshi-qtc-dev 进行备份处理

[root@k8s-master-01 velero-plugin]# velero backup create panshi-backup —include-namespaces panshi-qtc-dev —wait Backup request “panshi-backup” submitted successfully. Waiting for backup to complete. You may safely press ctrl-c to stop waiting - your backup will continue in the background. .. Backup completed with status: Completed. You may check for more information using the commands velero backup describe panshi-backup and velero backup logs panshi-backup.

  1. - 查看备份是否成功

[root@k8s-master-01 velero-plugin]# velero backup describe panshi-backup Name: panshi-backup Namespace: velero Labels: velero.io/storage-location=default Annotations: Phase: Completed Namespaces: Included: panshi-qtc-dev Excluded: Resources: Included: * Excluded: Cluster-scoped: auto Label selector: Storage Location: default Velero-Native Snapshot PVs: auto TTL: 720h0m0s Hooks: Backup Format Version: 1 Started: 2020-06-17 10:09:28 +0800 CST Completed: 2020-06-17 10:09:31 +0800 CST Expiration: 2020-07-17 10:09:28 +0800 CST Velero-Native Snapshots:

  1. - 查看OSS备份 (默认)<br />![](https://cdn.nlark.com/yuque/0/2020/png/255717/1593740413547-70b3ef35-46e1-4204-92ea-7f3808bba284.png#align=left&display=inline&height=754&margin=%5Bobject%20Object%5D&originHeight=754&originWidth=1788&size=0&status=done&style=none&width=1788)
  2. - 在现有集群中删除掉 panshi-qtc-dev 所有资源 (其实只需要 delete namespaces panshi-qtc-dev )

[root@k8s-master-01 velero-plugin]# kubectl delete namespaces panshi-qtc-dev namespace “panshi-qtc-dev” deleted [root@k8s-master-01 velero-plugin]# kubectl get pods -n panshi-qtc-dev No resources found in panshi-qtc-dev namespace. [root@k8s-master-01 velero-plugin]# kubectl get svc -n panshi-qtc-dev No resources found in panshi-qtc-dev namespace. [root@k8s-master-01 velero-plugin]# kubectl get ing -n panshi-qtc-dev No resources found in panshi-qtc-dev namespace. [root@k8s-master-01 velero-plugin]# kubectl get namespaces | grep panshi-qtc-dev

  1. - 查看 panshi-qtc-dev 的备份

[root@k8s-master-01 velero-plugin]# velero backup get | grep panshi-backup panshi-backup Completed 2020-06-17 10:09:28 +0800 CST 29d default

  1. - 使用 panshi-qtc-dev 的备份 panshi-qtc-dev 进行恢复

[root@k8s-master-01 velero-plugin]# velero restore create —from-backup panshi-backup —wait Restore request “panshi-backup-20200617101819” submitted successfully. Waiting for restore to complete. You may safely press ctrl-c to stop waiting - your restore will continue in the background. . Restore completed with status: Completed. You may check for more information using the commands velero restore describe panshi-backup-20200617101819 and velero restore logs panshi-backup-20200617101819.

  1. ```
  2. [root@k8s-master-01 velero-plugin]# kubectl get pods -n panshi-qtc-dev
  3. NAME READY STATUS RESTARTS AGE
  4. panshi-api3rd-server-7cdb88b4c7-dp7f5 1/1 Running 0 26s
  5. panshi-contract-server-7dc4544966-bxlp7 1/1 Running 0 26s
  6. panshi-pdf-server-7774fc6c48-ljr7j 1/1 Running 0 26s
  7. panshi-storage-server-75b88b8bdf-7f4js 1/1 Running 0 26s
  8. panshi-system-server-7fc894cbff-hxxq9 1/1 Running 0 26s
  9. [root@k8s-master-01 velero-plugin]# kubectl get svc -n panshi-qtc-dev
  10. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  11. panshi-api3rd-server ClusterIP 10.107.61.235 <none> 8899/TCP 33s
  12. panshi-contract-server ClusterIP 10.101.127.48 <none> 8060/TCP 33s
  13. panshi-pdf-server ClusterIP 10.108.234.180 <none> 8940/TCP 33s
  14. panshi-storage-server ClusterIP 10.106.5.116 <none> 9100/TCP 33s
  15. panshi-system-server ClusterIP 10.109.232.187 <none> 8250/TCP 33s

至此 :使用velero 对集群备份恢复已经实现

  • 使用velero 恢复后观察OSS
    13.8、使用Velero进行集群备份、恢复与迁移 - 图7

    高级用法

  • 定时备份
    对集群资源进行定时备份,则可在发生意外的情况下,进行恢复(默认情况下,备份保留 30 天)。

    1. # 每日1点进行备份
    2. velero create schedule <SCHEDULE NAME> --schedule="0 1 * * *"
    3. # 每日1点进行备份,备份保留72小时
    4. velero create schedule <SCHEDULE NAME> --schedule="0 1 * * *" --ttl 72h
    5. # 每5小时进行一次备份
    6. velero create schedule <SCHEDULE NAME> --schedule="@every 5h"
    7. # 每日对 指定 namespace 进行一次备份 (如panshi-qtc-dev)
    8. velero create schedule <SCHEDULE NAME> --schedule="@every 24h" --include-namespaces panshi-qtc-dev

    定时备份的名称为:-,
    恢复命令为:velero restore create —from-backup -。

    备份删除
  • 直接执行命令进行删除

    1. velero delete backups <BACKUP_NAME>

    备份资源查看

    备份查看

    1. velero backup get

    查看定时备份

    1. velero schedule get

    查看可恢复备份

    1. velero restore get

    备份排除项目

    可为资源添加指定标签,添加标签的资源在备份的时候被排除。

    添加标签
    1. kubectl label -n <ITEM_NAMESPACE> <RESOURCE>/<NAME> velero.io/exclude-from-backup=true
    2. ### 为 default namespace 添加标签
    3. kubectl label -n default namespace/default velero.io/exclude-from-backup=true

    问题汇总

    时区问题
    进行定时备份时,发现备份使用的事 UTC 时间,并不是本地时间,经过排查后发现是 velero 镜像的时区问题,将时区调整一致即可。

    集群迁移

    迁移方法同备份,在备份后切换集群,在新集群恢复备份即可。