Velero備份恢復
1、velero介紹
- Velero 是一個提供 Kubernetes 集群和持久卷的備份、遷移以及災難恢復等的開源工具。
- Velero 是一個雲原生的災難恢復和遷移工具,它本身也是開源的, 采用 Go 語言編寫,可以安全的備份、恢復和遷移Kubernetes集群資源和持久卷。
- Velero 是一種雲原生的Kubernetes優化方法,支持標准的K8S集群,既可以是私有雲平台也可以是公有雲。除了災備之外它還能做資源移轉,支持把容器應用從一個集群遷移到另一個集群。
- 使用velero可以對集群進行備份和恢復,降低集群DR造成的影響。velero的基本原理就是將集群的數據備份到對象存儲中,在恢復的時候將數據從對象存儲中拉取下來。

2、velero備份過程
- 本地 Velero 客戶端發送備份指令。
- Kubernetes 集群內就會創建一個 Backup 對象。
- BackupController 監測 Backup 對象並開始備份過程。
- BackupController 會向 API Server 查詢相關數據。
- BackupController 將查詢到的數據備份到遠端的對象存儲。
3、velero特性
- Velero 目前包含以下特性:
- 支持 Kubernetes 集群數據備份和恢復
- 支持復制當前 Kubernetes 集群的資源到其它 Kubernetes 集群
- 支持復制生產環境到開發以及測試環境
4、velero組件
Velero 組件一共分兩部分,分別是服務端和客戶端。
服務端:運行在你 Kubernetes 的集群中
客戶端:是一些運行在本地的命令行的工具,需要已配置好 kubectl 及集群 kubeconfig 的機器上
5、支持的備份組件
AWS S3 以及兼容 S3 的存儲,比如:Minio
Azure BloB 存儲
Google Cloud 存儲
Aliyun OSS 存儲(https://github.com/AliyunContainerService/velero-plugin)
Github項目地址:velero
6、適應場景
災備場景:提供備份恢復k8s集群的能力
遷移場景:提供拷貝集群資源到其他集群的能力(復制同步開發,測試,生產環境的集群配置,簡化環境配置)
安裝
下面我以騰訊雲COS為例安裝:
k8s集群版本 :1.19.3
velero版本: 1.6.3
1.1 下載velero
velero:https://github.com/vmware-tanzu/velero/releases/download/v1.4.2/velero-v1.4.2-linux-amd64.tar.gz
tar xf velero-v1.4.2-linux-amd64.tar.gz
cd velero-v1.4.2-linux-amd64
mv velero /bin/
chmod +x /bin/velero
查看velero命令是否安裝成功
velero -h
1.2 創建憑證

- 服務上創建憑證
AK和SK登錄騰訊雲,通過【訪問管理】-【訪問密鑰】-【API密鑰管理】進行查看
vim credentials-velero
[default]
3aws_access_key_id = xxx #ak
4aws_secret_access_key = xxx # sk
1.3 安裝
點擊存儲桶---基礎配置---基本信息就可以看到
velero install \
--provider aws \
--plugins ccr.ccs.tencentyun.com/public_images/velero-plugin-for-aws:v1.2.0 \
--bucket velero-1258897006 \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--use-restic \
--default-volumes-to-restic \
--kubeconfig /root/.kube/config \
--backup-location-config region="ap-nanjing",s3ForcePathStyle="false",s3ForcePathStyle="false",s3Url=http://cos.ap-nanjing.myqcloud.com
1.4 檢測
安裝完成會看到
Namespace/velero: attempting to create resource
26Namespace/velero: created
27ClusterRoleBinding/velero: attempting to create resource
28ClusterRoleBinding/velero: created
29ServiceAccount/velero: attempting to create resource
30ServiceAccount/velero: created
31Secret/cloud-credentials: attempting to create resource
32Secret/cloud-credentials: created
33BackupStorageLocation/default: attempting to create resource
34BackupStorageLocation/default: created
35Deployment/velero: attempting to create resource
36Deployment/velero: created
37DaemonSet/restic: attempting to create resource
38DaemonSet/restic: created
39Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.
```
執行看日志是否有報錯
# kubectl logs deployment/velero -n velero
查看namespace velero命名空間是否創建
kubectl get ns
查看命名空間velero pod服務是否運行正常
[root@node01 ~]# kubectl get pods -n velero
NAME READY STATUS RESTARTS AGE
restic-fv4d2 1/1 Running 0 44h
restic-pxrkg 1/1 Running 0 44h
velero-5d75cc4c45-spx8q 1/1 Running 0 44h
安裝失敗或者從新安裝執行
清理刪除velero服務(如需刪除重新安裝時使用)
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero
1.5 創建測試應用
velero-v1.4.2 文件加中有 base.yaml文件測試
velero-v1.4.2/examples/nginx-app
rw-r--r-- 1 501 dialout 1237 Mar 6 2020 base.yaml
-rw-r--r-- 1 501 dialout 521 Dec 10 2019 README.md
-rw-r--r-- 1 501 dialout 2375 Mar 6 2020 with-pv.yaml
```
[root@master velero-v1.4.2-linux-amd64]# kubectl apply -f examples/nginx-app/base.yaml
namespace/nginx-example created
deployment.apps/nginx-deployment
created service/my-nginx created
[root@master velero-v1.4.2-linux-amd64]# kubectl get all -n nginx-example
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-5754944d6c-9vr2w 1/1 Running 0 115s
pod/nginx-deployment-5754944d6c-tczg9 1/1 Running 0 113s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/my-nginx LoadBalancer 10.233.6.201 <pending> 80:32322/TCP 28m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 2/2 2 2 28m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-5754944d6c 2 2 2 28m
執行備份 后查看COS存儲桶是否有備份文件
velero backup create nginx-backup --include-namespaces nginx-example
刪除之前創建的資源
kubectl delete -f examples/nginx-app/base.yaml
驗證資源已完全刪除
kubectl get all -n nginx-example
指定對應的備份名稱
velero restore create --from-backup nginx-backup
驗證資源是否恢復
kubectl get all -n nginx-example
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-5754944d6c-9vr2w 1/1 Running 0 8s
pod/nginx-deployment-5754944d6c-tczg9 1/1 Running 0 8s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/my-nginx LoadBalancer 10.233.33.109 <pending> 80:30734/TCP 7s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 2/2 2 2 8s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-5754944d6c 2 2 2 8s
解析
velero install \
--provider aws \
--plugins ccr.ccs.tencentyun.com/public_images/velero-plugin-for-aws:v1.2.0 \
--bucket velero-1258897006 \ #存儲桶名
--secret-file ./credentials-velero \ #憑證
--use-volume-snapshots=false \
--use-restic \ #啟用靜態備份
--default-volumes-to-restic \ #備份所有 pod 卷
--kubeconfig /root/.kube/config \ #指定k8s集群配置文件;
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://IP:9000 #這里是剛才部署minio存儲的api接口,可以通過mino容器查看。
--backup-location-config region="ap-nanjing",s3ForcePathStyle="false",s3ForcePathStyle="false",s3Url=http://cos.ap-nanjing.myqcloud.com #雲存儲接口
velero 命令
#備份查看
velero get backup
#查看定時備份
velero get schedule
#查看已有的恢復
velero get restore
#查看插件
velero get plugins
#備份 namespace
velero backup create NAMESPACE-backup --include-namespaces NAMESPACE
##查看備份
velero backup describe NAMESPACE-backup .
#指定對應的備份名稱
velero restore create --from-backup test-backup
# 每日1點進行備份
velero create schedule <SCHEDULE NAME> --schedule="0 1 * * *"
# 每日1點進行備份,備份保留72小時
velero create schedule <SCHEDULE NAME> --schedule="0 1 * * *" --ttl 72h
# 每5小時進行一次備份
velero create schedule <SCHEDULE NAME> --schedule="@every 5h"
# 每日對 指定 namespace 進行一次備份 (如panshi-qtc-dev)
velero create schedule <SCHEDULE NAME> --schedule="@every 24h" --include-namespaces panshi-qtc-dev
#恢復
velero restore create --from-backup pvc-backup --restore-volumes
演示示例:
[root@master01 velero]# kubectl get po -n db
NAME READY STATUS RESTARTS AGE
retail-gitlab-54b9f56b6c-66h9w 1/1 Running 0 25d
retail-mysql-6b7f8bdfb8-s4nct 1/1 Running 2 116d
retail-redis-86bd9b5599-5tvlv 1/1 Running 0 21d
velero backup create db-backup --include-namespaces db #備份整個db名稱空間

restic文件備份是數據

backup備份是yaml、pv、pvc配置文件,是以json為文本

