使用 Velero 进行集群备份、恢复与迁移

前言:

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

velero可以帮助我们:
灾备场景,提供备份恢复k8s集群的能力
迁移场景,提供拷贝集群资源到其他集群的能力(复制同步开发,测试,生产环境的集群配置,简化环境配置)

下面我就介绍一下如何使用 Velero 完成备份和迁移。

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

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 的工作原理图如下:

使用 Velero 进行集群备份、恢复与迁移_第1张图片

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

安装 Velero 服务

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

[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 包

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

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

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

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

创建 OSS bucket

创建一个 OSS bucket 用于存储备份文件,这里也可以用已有的 bucket,之后会在 bucket 中创建 test 目录,这里建议在已有的 bucket 中创建一个子目录用于存储备份文件。

创建 OSS Bucket 过程~~~~

创建 OSS 的时候一定要选对区域,要和 ACK 集群在同一个区域,存储类型和读写权限选择标准存储和私有:
使用 Velero 进行集群备份、恢复与迁移_第3张图片

创建阿里云 RAM 用户

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

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "oss:*",
            "Resource": [
                "acs:oss:*:*:pps-k8s-backup/*",
                "acs:oss:*:*:pps-k8s-backup"
            ]
        }
    ]
}

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

部署服务端

  • 拉取 Velero 插件 :
git clone https://github.com/AliyunContainerService/velero-plugin
  • 修改配置:
    修改 install/credentials-velero 文件,
    将新建用户中获得的 AccessKeyID 和 AccessKeySecret 填入,这里的 OSS EndPoint 为之前 OSS 的访问域名(注:这里需要选择外网访问的 EndPoint。)
    使用 Velero 进行集群备份、恢复与迁移_第6张图片
	[root@k8s-master-01 velero-plugin]# more install/credentials-velero
	ALIBABA_CLOUD_ACCESS_KEY_ID=
	ALIBABA_CLOUD_ACCESS_KEY_SECRET=
	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
  • k8s 部署 Velero 服务
新建 namespace
kubectl create namespace velero
部署 credentials-velero 的 secret
kubectl create secret generic cloud-credentials --namespace velero --from-file cloud=install/credentials-velero
部署 CRD
kubectl apply -f install/00-crds.yaml
部署 Velero
kubectl apply -f install/01-velero.yaml
  • 测试 Velero 状态
[root@k8s-master-01 velero-plugin]# velero version
Client:
	Version: v1.4.0
	Git commit: 5963650c9d64643daaf510ef93vc4a46b6283392
Server:
	Version: v1.2.0

可以看到 Velero 的客户端和服务端已经部署成功。

  • 服务端清理

在完成测试或者需要重新安装时,执行如下命令进行清理:

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

备份测试

[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
  • 使用 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`.
  • 查看备份是否成功
[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: 
  • 查看OSS备份 (默认)
    使用 Velero 进行集群备份、恢复与迁移_第7张图片
  • 在现有集群中删除掉 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
  • 查看 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            
  • 使用 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`.
[root@k8s-master-01 velero-plugin]# kubectl get pods -n panshi-qtc-dev
NAME                                      READY   STATUS    RESTARTS   AGE
panshi-api3rd-server-7cdb88b4c7-dp7f5     1/1     Running   0          26s
panshi-contract-server-7dc4544966-bxlp7   1/1     Running   0          26s
panshi-pdf-server-7774fc6c48-ljr7j        1/1     Running   0          26s
panshi-storage-server-75b88b8bdf-7f4js    1/1     Running   0          26s
panshi-system-server-7fc894cbff-hxxq9     1/1     Running   0          26s
[root@k8s-master-01 velero-plugin]# kubectl get svc  -n panshi-qtc-dev
NAME                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
panshi-api3rd-server     ClusterIP   10.107.61.235            8899/TCP   33s
panshi-contract-server   ClusterIP   10.101.127.48            8060/TCP   33s
panshi-pdf-server        ClusterIP   10.108.234.180           8940/TCP   33s
panshi-storage-server    ClusterIP   10.106.5.116             9100/TCP   33s
panshi-system-server     ClusterIP   10.109.232.187           8250/TCP   33s

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

  • 使用velero 恢复后观察OSS
    使用 Velero 进行集群备份、恢复与迁移_第8张图片

高级用法

  • 定时备份
    对集群资源进行定时备份,则可在发生意外的情况下,进行恢复(默认情况下,备份保留 30 天)。
# 每日1点进行备份
velero create schedule  --schedule="0 1 * * *"
# 每日1点进行备份,备份保留72小时
velero create schedule  --schedule="0 1 * * *" --ttl 72h
# 每5小时进行一次备份
velero create schedule  --schedule="@every 5h"
# 每日对 指定 namespace 进行一次备份 (如panshi-qtc-dev)
velero create schedule  --schedule="@every 24h" --include-namespaces panshi-qtc-dev

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

备份删除
  • 直接执行命令进行删除
velero delete backups 
备份资源查看

备份查看

velero backup get

查看定时备份

velero schedule get

查看可恢复备份

velero restore get
备份排除项目

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

添加标签
kubectl label -n  / velero.io/exclude-from-backup=true
### 为 default namespace 添加标签
kubectl label -n default namespace/default velero.io/exclude-from-backup=true

问题汇总

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

集群迁移

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

你可能感兴趣的:(K8S,Docker,Linux)