前言:
一般来说大家都用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 首先会在集群中创建各种 CRD 以及相关的控制器,通过对 CRD 对象的操作完成备份、恢复行为。Velero 的工作原理图如下:
Velero 客户端调用 Kubernetes API 服务器创建 Backup 对象。
BackupController 监听 Backup 对象变化,以执行备份过程。
备份时,BackupController 通过 API Server 查询相关数据。
备份后,BackupController 将数据上传到对象存储。
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
创建一个 OSS bucket 用于存储备份文件,这里也可以用已有的 bucket,之后会在 bucket 中创建 test 目录,这里建议在已有的 bucket 中创建一个子目录用于存储备份文件。
创建 OSS Bucket 过程~~~~
创建 OSS 的时候一定要选对区域,要和 ACK 集群在同一个区域,存储类型和读写权限选择标准存储和私有:
用于操作 OSS 以及 ACK 资源,新建权限策略,
策略内容:(进行测试时)
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:*:*:pps-k8s-backup/*",
"acs:oss:*:*:pps-k8s-backup"
]
}
]
}
在新建用户的时候要选择 编程访问,来获取 AccessKeyID 和 AccessKeySecret。
git clone https://github.com/AliyunContainerService/velero-plugin
[root@k8s-master-01 velero-plugin]# more install/credentials-velero
ALIBABA_CLOUD_ACCESS_KEY_ID=
ALIBABA_CLOUD_ACCESS_KEY_SECRET=
ALIBABA_CLOUD_OSS_ENDPOINT=
---
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
kubectl create namespace velero
kubectl create secret generic cloud-credentials --namespace velero --from-file cloud=install/credentials-velero
kubectl apply -f install/00-crds.yaml
kubectl apply -f install/01-velero.yaml
[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
[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:
[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
[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
[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 对集群备份恢复已经实现
# 每日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 镜像的时区问题,将时区调整一致即可。
迁移方法同备份,在备份后切换集群,在新集群恢复备份即可。