天天看點

Kubernetes進階之應用與持久化資料卷備份遷移實踐

  • 0x00 前言簡述
  • 1.Velero 基礎概述
  • 2.Velero 工作原理
  • 3.Provider 插件供應商
  • 4.補充說明
  • 0x01 環境部署
  • 1.先決條件
  • 2.下載下傳部署 Velero
  • 3.設定Minio伺服器
  • 0x02 備份遷移實踐
  • 1.官方示例
  • 2.實戰容災恢複
  • 0x0n 入坑出坑
  • 1.采用Velero 1.6.2 提供得官方資源清單部署後從無法通路 ​

    ​MINIO Web-UI​

    ​ 管理界面

0x00 前言簡述

引言

在運維安全管理中容災備份是非常重要的一環, 那在Kubernetes叢集中如何進行備份和遷移 Kubernetes 資源和持久卷資料。

常常采用手動進行容災備份, 如備份資源清單、或者helm模闆,但是針對Kubernetes 資源和持久卷(​​

​PV/PVC​

​)中得資料無法進行備份遷移,是以在這樣得場景下我們就需要 Velero 是一個開源工具。

1.Velero 基礎概述

What: 什麼是 Velero?

答: Velero (以前稱為 ​

​Heptio Ark​

​)是一個開源工具,用于安全備份和恢複、執行災難恢複以及遷移 Kubernetes 叢集資源和持久卷。

Why: 為啥要使用 Velero?

答: Velero 可以讓您​

​備份您的叢集并在丢失時恢複​

​​、​

​将叢集資源遷移到其他叢集​

​​、​

​将您的生産叢集複制到開發和測試叢集​

​, 詳細解析說明:
  • 1.災難恢複 : 在基礎設施丢失、資料損壞和/或服務中斷的情況下減少恢複時間。
  • 2.資料遷移 : 通過輕松地将 Kubernetes 資源從一個叢集遷移到另一個叢集,實作叢集可移植性。
  • 3.資料保護 : 提供關鍵資料保護功能,例如計劃備份、保留計劃以及用于自定義操作的備份前或備份後挂鈎。

Velero 特點: 您可以備份或恢複叢集中的所有對象,也可以按類型、命名空間和/或标簽過濾對象。

  • 1.備份叢集 : 使用命名空間或标簽選擇器為整個叢集或叢集的一部分備份 Kubernetes 資源和卷。
  • 2.計劃備份 : 設定計劃以定期自動啟動備份。
  • 3.備份挂鈎 : 配置備份前和備份後挂鈎,以在 Velero 備份之前和之後執行自定義操作。

How: 你如何使用 Velero?

答: 您可以通過雲提供商或本地運作 Velero, 其元件包括​

​在叢集上運作的伺服器​

​​和​

​本地運作的指令行用戶端​

​​。

使用​​

​Minio​

​​服務進行管理存儲備份在ETCD的資料、使用​

​velero​

​用戶端進行備份和還原操作。

2.Velero 工作原理

描述: 一般得使用Velero主要是從以下三個方面入手。

  • 1.按需備份: 将複制的 Kubernetes 對象的 tarball 上傳到雲對象存儲中,調用雲提供商 API 以制作持久卷的磁盤快照(如果指定)。
  • 2.計劃備份: 由 Cron 表達式指定在循環間隔備份您的資料,計劃備份以名稱儲存​

    ​<SCHEDULE NAME>-<TIMESTAMP>​

    ​,其中​

    ​<TIMESTAMP>​

    ​格式為​

    ​YYYYMMDDhhmmss​

    ​。
  • 3.容災恢複: 該恢複操作可以恢複所有對象和持久卷從先前建立的備份,還原的預設名稱為​

    ​<BACKUP NAME>-<TIMESTAMP>​

    ​, 恢複的對象還包括一個帶有 key ​

    ​velero.io/restore-name​

    ​ 和 value的标簽​

    ​<RESTORE NAME>​

  • 4.備份過期: 可以通過添加标志來指定​

    ​--ttl <DURATION>​

    ​參數來設定備份得生存時間(預設30天)。到期後則會删除​

    ​備份資源、來自雲對象存儲的備份檔案、所有 PersistentVolume 快照、所有關聯的恢複​

    ​。
  • 5.對象存儲同步: 它會不斷檢查以確定始終存在正确的備份資源。如果存儲桶中有格式正确的備份檔案,但 Kubernetes API 中沒有相應的備份資源,Velero 會将資訊從對象存儲同步到 Kubernetes。

備份工作流程:

描述: 當你運作​​

​velero backup create test-backup​

​指令。

1.Velero 用戶端調用 Kubernetes API 伺服器來建立一個Backup對象。

2.該 BackupController 注意到新的 Backup 對象并進行驗證。

3.在 BackupController 開始備份過程。它通過向 API 伺服器查詢資源來收集要備份的資料。

4.将 BackupController 使得對象存儲服務的調用-例如,AWS S3 -上傳備份檔案。

預設情況下 ​

​velero backup create​

​​ 為任何持久卷制作磁盤快照, 可以通過指定附加标志來調整快照​

​--snapshot-volumes=false​

​(使用選項禁用快照)。

Kubernetes進階之應用與持久化資料卷備份遷移實踐

Tips : 實際上 ​

​Velero​

​​ 在 ​

​Kubernetes​

​ 叢集中建立了很多 CRD 以及相關的控制器,進行備份恢複等操作實質上是對相關 CRD 的操作。

Tips : Velero 使用 Kubernetes API 伺服器的首選版本為每個組/資源備份資源。恢複資源時,目标叢集中必須存在​

​相同的 API 組/版本​

​才能成功恢複。

3.Provider 插件供應商

描述: Velero 有一個插件系統支援各種存儲提供程式,用于不同的備份和快照操作。它允許任何人在不修改 Velero 代碼庫的情況下為其他備份和卷存儲平台添加相容性。

Velero 支援的備份存儲Provider

提供者 對象存儲 卷快照程式 插件提供程式存儲庫 安裝說明
亞馬遜網絡服務 (AWS) AWS S3 AWS EBS 适用于 AWS 的 Velero 插件 AWS 插件設定 (以及s3相容的存儲比如minio)
谷歌雲平台 (GCP) 谷歌雲存儲 谷歌計算引擎磁盤 GCP 的 Velero 插件 GCP 插件設定
微軟 Azure Azure Blob 存儲 Azure 托管磁盤 适用于 Microsoft Azure 的 Velero 插件 Azure 插件設定
VMware vSphere 🚫 vSphere 卷 VMware vSphere vSphere 插件設定
容器存儲接口 (CSI) 🚫 CSI 卷 CSI 的 Velero 插件 CSI 插件設定

Velero 社群支援的Provider

Provider Object Store Volume Snapshotter Plugin Documentation Contact
AlibabaCloud Alibaba Cloud OSS Alibaba Cloud AlibabaCloud GitHub Issue
DigitalOcean DigitalOcean Object Storage DigitalOcean Volumes Block Storage StackPointCloud
Hewlett Packard 🚫 HPE Storage Hewlett Packard Slack, GitHub Issue
OpenEBS 🚫 OpenEBS CStor Volume OpenEBS Slack, GitHub Issue
OpenStack Swift Cinder OpenStack GitHub Issue
Portworx 🚫 Portworx Volume Portworx Slack, GitHub Issue
Storj Storj Object Storage 🚫 Storj GitHub Issue

4.補充說明

參考來源:

  • velero 官網: https://velero.io/
  • velero 手冊: https://velero.io/docs/v1.6/
  • velero 供應商: https://velero.io/docs/v1.6/supported-providers/

0x01 環境部署

1.先決條件

  • Kubernetes 叢集 API Version >= 1.7
  • Kubernetes 叢集已部署 DNS 伺服器 (例如: CoreDNS)。
  • 在 Minio 中存儲備份可用磁盤空間少于 1GB,Minio 将無法運作。

2.下載下傳部署 Velero

  • 1.下載下傳 最新的官方版本的tarball,每個版本的 tarball 都包含​

    ​velero​

    ​指令行用戶端,,并将​

    ​elero​

    ​二進制檔案從 Velero 目錄移動到 PATH 中的某個位置。
curl -fSL https://github.com/vmware-tanzu/velero/releases/download/v1.6.2/velero-v1.6.2-linux-amd64.tar.gz 
tar -zxvf velero-v1.6.2-linux-amd64.tar.gz -C /usr/local/
ln -s /usr/local/velero-v1.6.2-linux-amd64/velero /usr/bin/velero      
  • 2.驗證 Velero Client
velero version
Client:
        Version: v1.6.2
        Git commit: 8c9cdb9603446760452979dc77f93b17054ea1cc      

3.設定Minio伺服器

描述: 這些指令啟動 Velero 伺服器和一個隻能從叢集内部通路的 Minio 執行個體,我們可以配置叢集以從外部通路 Minio 的資訊,通路日志和運作​

​velero describe​

​指令需要外部通路。

  • 1.在本地目錄中建立 Velero 特定的憑據檔案。
tee /tmp/credentials-velero <<'EOF'
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123
EOF      
  • 2.修改啟動伺服器和本地存儲服務。
# 在 Velero 目錄中解壓目錄中 修改 examples/minio/00-minio-deployment.yaml , 内容如下
---
apiVersion: v1
kind: Namespace
metadata:
name: velero

---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: velero
name: minio
labels:
component: minio
spec:
strategy:
type: Recreate
selector:
matchLabels:
component: minio
template:
metadata:
labels:
component: minio
spec:
volumes:
- name: storage
emptyDir: {}
- name: config
emptyDir: {}
containers:
- name: minio
image: minio/minio:latest
imagePullPolicy: IfNotPresent
# 設定靜态得Console監控端口(推薦)
args:
- server
- /storage
- --config-dir=/config
- --console-address
- ":31234"
# 注意事項: 主要修改點是以下環境變量名稱`MINIO_ROOT_USER|MINIO_ROOT_PASSWORD`否則。
# WARNING: MINIO_ACCESS_KEY and MINIO_SECRET_KEY are deprecated.
# Please use MINIO_ROOT_USER and MINIO_ROOT_PASSWORD
env:
- name: MINIO_ROOT_USER
value: "minio"
- name: MINIO_ROOT_PASSWORD
value: "minio123"
# Pod 暴露 minio 服務和 console web 服務端口以供SVC使用
ports:
- name: web
containerPort: 9000
- name: console
containerPort: 31234
volumeMounts:
- name: storage
mountPath: "/storage"
- name: config
mountPath: "/config"
---
apiVersion: v1
kind: Service
metadata:
namespace: velero
name: minio
labels:
component: minio
spec:
# ClusterIP is recommended for production environments.
# Change to NodePort if needed per documentation,
# but only if you run Minio in a test/trial environment, for example with Minikube.
type: NodePort
ports:
- name: web
port: 9000
targetPort: 9000
nodePort: 30090
protocol: TCP
- name: console
port: 31234
targetPort: 31234
nodePort: 31234
protocol: TCP
selector:
component: minio

---
apiVersion: batch/v1
kind: Job
metadata:
namespace: velero
name: minio-setup
labels:
component: minio
spec:
template:
metadata:
name: minio-setup
spec:
restartPolicy: OnFailure
volumes:
- name: config
emptyDir: {}
containers:
- name: mc
image: minio/mc:latest
imagePullPolicy: IfNotPresent
# Minio狀态檢測
command:
- /bin/sh
- -c
- "mc --config-dir=/config config host add velero http://minio:9000 minio minio123 && mc --config-dir=/config mb -p velero/velero"
volumeMounts:
- name: config
mountPath: "/config"      

Tips: 注意 Velero 1.6.2 版本中minio得yaml配置檔案我們需要相應進行改變。

Tips: 注意 提供的 Minio yaml 示例使用"空目錄",您的節點需要有足夠的可用空間來存儲要備份的資料以及 1GB 的可用空間。如果節點沒有足夠的空間,您可以修改示例 yaml 以使用 ​

​Persistent Volume​

​​ 而不是​

​empty dir​

​。

Tips : 注意 使用 Service 在叢集外公開 Minio 時需要Pod暴露兩個應用端口即​

​Service 9000​

​​和​

​Console 預設随機​

​,此時你可以将将 Minio 服務類型從更改ClusterIP為NodePort,具體配置檢視上述資源清單。

  • 2.部署minio資源清單以及服務檢視
# 使用本地叢集minio作為備份存儲
kubectl apply -f examples/minio/00-minio-deployment.yaml
# namespace/velero created
# deployment.apps/minio created
# service/minio created
# job.batch/minio-setup created

kubectl get svc -n velero
# NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                          AGE
# service/minio   NodePort   10.100.123.198   <none>        9000:30090/TCP,31234:31234/TCP   7m25s      

此時通路​

​http://192.168.12.107:30090​

​​ 可以看到 Minio 服務端, 此時它會通路跳轉 ​

​http://192.168.12.107:31234/login​

​​, 登入得賬号密碼: ​

​minio / minio123​

​ 。

Kubernetes進階之應用與持久化資料卷備份遷移實踐
  • 3.在用戶端中安裝 velero 用戶端。
# 擷取指定 minio 服務位址和服務端口
minio_service_ip="192.168.12.107"
minio_service_port=$(kubectl -n velero get svc/minio -o jsonpath='{.spec.ports[0].nodePort}')

# kubernetes Master 節點上安裝 velero 或者在其他叢集上安裝執行
velero install \
  --image velero/velero:v1.6.2 \
  --provider aws \
  --bucket velero \
  --namespace velero \
  --plugins velero/velero-plugin-for-aws:v1.2.0 \
  --secret-file /tmp/credentials-velero \
  --velero-pod-cpu-request 200m \
  --velero-pod-mem-request 200Mi \
  --velero-pod-cpu-limit 1000m \
  --velero-pod-mem-limit 1000Mi \
  --use-volume-snapshots=false \
  --use-restic \
  --restic-pod-cpu-request 200m \
  --restic-pod-mem-request 200Mi \
  --restic-pod-cpu-limit 1000m \
  --restic-pod-mem-limit 1000Mi \
  --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://${minio_service_ip}:${minio_service_port}

# 出現下述表示安裝成功, 并且此時可以看到相關服務已經正常運作,Job 任務正常完成退出,大量 CRD 被建立。
# Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.      
  • 4.在​

    ​kubernetes​

    ​主節點中驗證檢視​

    ​velero​

    ​部署得所有服務。
$ kubectl get all -n velero
# NAME                         READY   STATUS    RESTARTS   AGE
# pod/minio-b46c8d7d5-4qt4x    1/1     Running   0          4m50s
# pod/restic-568nx             1/1     Running   0          98s
# .......
# pod/restic-vs5s9             1/1     Running   0          98s
# pod/velero-7b8b8fc8f-rcwb2   1/1     Running   0          98s

# NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)                          AGE
# service/minio   NodePort   10.100.123.198   <none>        9000:30090/TCP,31234:31234/TCP   9m10s

# NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
# daemonset.apps/restic   4         4         4       4            4           <none>          98s

# NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
# deployment.apps/minio    1/1     1            1           10m
# deployment.apps/velero   1/1     1            1           98s

# NAME                               DESIRED   CURRENT   READY   AGE
# replicaset.apps/minio-57c7d49f8c   0         0         0       6m
# replicaset.apps/minio-6489c45fb5   0         0         0       10m
# replicaset.apps/minio-b46c8d7d5    1         1         1       4m50s
# replicaset.apps/velero-7b8b8fc8f   1         1         1       98s

# NAME                    COMPLETIONS   DURATION   AGE
# job.batch/minio-setup   0/1           9m10s      9m10s

$ kubectl logs -n velero pod/minio-b46c8d7d5-4qt4x
# API: http://172.16.100.91:9000  http://127.0.0.1:9000
# Console: http://172.16.100.91:31234 http://127.0.0.1:31234
# Documentation: https://docs.min.io      
  • 5.至此安裝​

    ​velero​

    ​服務已經成功。
$ velero version
Client:
  Version: v1.6.2
  Git commit: 8c9cdb9603446760452979dc77f93b17054ea1cc
Server:
  Version: v1.6.2      

0x02 備份遷移實踐

1.官方示例

  • Step 1.部署在​

    ​velero​

    ​解壓目錄中得​

    ​examples/nginx-app/base.yaml​

    ​檔案, 部署示例 nginx 應用程式。
$ kubectl apply -f examples/nginx-app/base.yaml
# namespace/nginx-example created
# deployment.apps/nginx-deployment created
# service/my-nginx created      
  • Step 2.檢查是否成功建立了部署 Velero 給出的 nginx-app 示例 。
kubectl get deployments -l component=velero --namespace=velero
kubectl get deployments --namespace=nginx-example      
  • Step 3.為與​

    ​app=nginx​

    ​标簽選擇器比對的任何對象建立備份。
$ velero backup create nginx-backup --selector app=nginx

$ velero backup describe nginx-backup --details
# Name:         nginx-backup
# Namespace:    velero
# Labels:       velero.io/storage-location=default
# Annotations:  velero.io/source-cluster-k8s-gitversion=v1.19.6
#               velero.io/source-cluster-k8s-major-version=1
#               velero.io/source-cluster-k8s-minor-version=19
# .......
# Phase:  Completed

# Resource List:
#   apps/v1/ReplicaSet:
#     - nginx-example/nginx-deployment-57d5dcb68
#   v1/Endpoints:
#     - nginx-example/my-nginx
#   v1/Namespace:
#     - nginx-example
#   v1/Pod:
#     - nginx-example/nginx-deployment-57d5dcb68-78x8z
#     - nginx-example/nginx-deployment-57d5dcb68-hcptr
#   v1/Service:
#     - nginx-example/my-nginx

# 或者如果要備份除與标簽比對的對象之外的所有對象 backup=ignore:
$ velero backup create nginx-backup --selector 'backup notin (ignore)'
# 使用app=nginx标簽選擇器根據 cron 表達式建立定期計劃備份:
$ velero schedule create nginx-daily --schedule="0 1 * * *" --selector app=nginx
# 或者,您可以使用一些非标準速記 cron 表達式:
$ velero schedule create nginx-daily --schedule="@daily" --selector app=nginx

# 檢視 velero 已備份的kubernetes應用資料
$ velero backup get
# NAME           STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
# nginx-backup   Completed   0        0          2021-08-06 19:04:21 +0800 CST   29d       default            app=nginx      
  • Step 4.容災恢複實戰流程示例
# 1.模拟災難删除名稱空間将會删除其下控制器。
kubectl delete namespace nginx-example

# 2.要檢查 nginx 部署和服務是否消失請運作。
kubectl get deployments --namespace=nginx-example
kubectl get services --namespace=nginx-example
kubectl get namespace/nginx-example
# Tips : 注意您可能需要等待幾分鐘才能完全清理命名空間。

# 3.利用 velero 中得備份進行恢複剛才删除名稱空間以及下面得各種控制器
velero restore create --from-backup nginx-backup
# Restore request "nginx-backup-20210806191516" submitted successfully.
# Run `velero restore describe nginx-backup-20210806191516` or `velero restore logs nginx-backup-20210806191516` for more details.

# 4.備份還原 nginx-backup 狀态檢視, 成功恢複後該STATUS列Completed, 并WARNINGS和ERRORS為0的所有對象nginx-example的命名空間應該隻是因為他們是你删除了他們面前。
velero restore get
# NAME                          BACKUP         STATUS      STARTED                         COMPLETED                       ERRORS   WARNINGS   CREATED                         SELECTOR
# nginx-backup-20210806191516   nginx-backup   Completed   2021-08-06 19:15:16 +0800 CST   2021-08-06 19:15:16 +0800 CST   0        0          2021-08-06 19:15:16 +0800 CST   <none>

# 5.如果有錯誤或警告可以詳細檢視,例如上述的 nginx-backup-20210806191516 還原記錄。
velero restore describe nginx-backup-20210806191516

# 6.檢視還原的Nginx服務是否已經正常。
kubectl get pod -l app=nginx      
  • Step 5.删除您建立的任何備份,包括對象存儲和持久卷快照中的資料你可以進行如下操作。
# - 1.删除指定名稱的備份
$ velero backup delete nginx-backup

# - 2.删除所有備份
$ velero backup delete --all
# Are you sure you want to continue (Y/N)? y
# Request to delete backup "nginx-backup" submitted successfully.
# The backup will be fully deleted after all associated data (disk snapshots, backup files, restores) are removed.

# - 3.完全删除後,運作時備份将不再可見:
velero backup get nginx-backup      
  • Step 6.要從 Kubernetes 叢集中完全解除安裝 Velero、minio 和 nginx 示例應用程式:
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero
kubectl delete -f examples/nginx-app/base.yaml      

Tips : 在 Docker (KinD) 中使用 Kubernetes 在叢集外公開 Minio

# 1.您可以使用端口轉發來通路 Minio 存儲桶。
MINIO_POD=$(kubectl get pods -n velero -l component=minio -o jsonpath='{.items[0].metadata.name}')
kubectl port-forward $MINIO_POD -n velero 9000:9000 

# 2.然後在另一個終端中執行如下指令, 并且将`publicUrl: http://localhost:9000`在該spec.config部分下添加。
kubectl edit backupstoragelocation default -n velero      

2.實戰容災恢複

環境說明:

- 自定義鏡像: harbor.weiyigeek.com.cn/devops/tomee:8.0.6-webprofile
- 應用war包: HelloWorld-v1.43.war
- 部署資源清單: HelloWorld.yaml 

$ ls 
HelloWorld-v1.43.war  HelloWorld.yaml      
  • Step 1.部署資源清單一覽(該應用示範包含動态持久化的​

    ​PVC/PV​

    ​卷 )
apiVersion: v1
kind: Service
metadata:
name: deploy-maven-svc
labels:
app: java-maven
spec:
type: NodePort         # Service 類型
selector:
app: java-maven       # 【注意】與deployment資源控制器建立的Pod标簽進行綁定;
release: stabel       # Service 服務發現不能缺少Pod标簽,有了Pod标簽才能與之SVC對應
ports:                  # 映射端口
- name: http
port: 8080              # cluster 通路端口
targetPort: 8080        # Pod 容器内的服務端口
nodePort: 30089
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: deploy-java-maven
labels:
app: java-maven
spec:
serviceName: "deploy-maven-svc"
replicas: 3                # 副本數
selector:                  # 選擇器
matchLabels:
app: java-maven   # 比對的Pod标簽非常重要
release: stabel
template:
metadata:
labels:
app: java-maven      # 模闆标簽
release: stabel
spec:
volumes:                # 關鍵點
- name: webapps         # 卷名稱
hostPath:             # 采用hostPath卷
type: DirectoryOrCreate   # 卷類型DirectoryOrCreate: 如果子節點上沒有該目錄便會進行建立
path: /nfsdisk-31/test/  # 各主機節點上已存在的目錄此處是NFS共享
- name: timezone     # 容器時區設定
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
containers:
- name: java-maven
#image: harbor.weiyigeek.com.cn/devops/tomcat:8.5.61-jdk8-corretto  # 拉取的鏡像
image: harbor.weiyigeek.com.cn/devops/tomee:8.0.6-webprofile
imagePullPolicy: IfNotPresent
command: ["bash","-c","rm -rf /usr/local/tomee/webapps/* && cp /tmp/${APPNAME} /usr/local/tomee/webapps/ROOT.war && catalina.sh run"]
env:
- name: APPNAME
value: HelloWorld-v1.43.war
ports:
- name: http         # 此端口在服務中的名稱
containerPort: 8080  # 容器暴露的端口
volumeMounts:        # 挂載指定卷目錄
- name: webapps      # Tomcat 應用目錄
mountPath: /tmp/
- name: logs         # Tomcat 日志目錄利用持久卷來進行存儲。
mountPath: /usr/local/tomee/logs
- name: timezone     # 鏡像時區設定
mountPath: /usr/share/zoneinfo/Asia/Shanghai
volumeClaimTemplates:      # 卷的體積要求模闆此處采用StorageClass存儲類主要針對于應用日志的存儲;
- metadata:                # 根據模闆自動建立PV與PVC并且進行一一對應綁定;
name: logs
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: managed-nfs-storage # StorageClass存儲類
resources:
requests:
storage: 1Gi      
  • Step 2.部署的​

    ​java-maven​

    ​應用資訊檢視
# (1) 檢視 k8s 部署的 java-maven 應用
kubectl get pod,sts,svc -o wide -l app=java-maven
# NAME                      READY   STATUS    RESTARTS   AGE
# pod/deploy-java-maven-0   1/1     Running   0          2d8h
# pod/deploy-java-maven-1   1/1     Running   0          2d8h
# pod/deploy-java-maven-2   1/1     Running   0          2d8h

# NAME                READY   AGE    CONTAINERS   IMAGES
# deploy-java-maven   3/3     2d9h   java-maven   harbor.weiyigeek.com.cn/devops/tomee:8.0.6-webprofile

# NAME                       TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
# service/deploy-maven-svc   NodePort   10.106.80.8   <none>        8080:30089/TCP   2d9h

# (2) 驗證檢視部署的服務
$ curl 192.168.12.107:30089
# <p> Server : Apache Tomcat (TomEE)/9.0.41 (8.0.6)  | 172.16.183.115 </p>
# <p> Client : 172.16.0.192 | 172.16.0.192</p>
# <p> Document_Root : /usr/local/tomee/webapps/ROOT/  <br/><br/> URL : 10.106.80.8/index.jsp  </p>      
  • Step 3.利用velero備份叢集中 java-maven 應用。
# (1) 指定備份帶有 app=java-maven 标簽的資源
velero backup create java-maven --selector app=java-maven
# Backup request "java-maven" submitted successfully.
# Run `velero backup describe java-maven` or `velero backup logs java-maven` for more details.

# (2) 檢視備份的 java-maven 資源
velero backup get
# NAME         STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
# java-maven   Completed   0        0          2021-08-06 19:47:57 +0800 CST   29d       default            app=java-maven

# (3) 備份的資源詳細資訊
velero backup describe java-maven --details
# Name:         java-maven
# Namespace:    velero
# Labels:       velero.io/storage-location=default
# Annotations:  velero.io/source-cluster-k8s-gitversion=v1.19.6
#               velero.io/source-cluster-k8s-major-version=1
#               velero.io/source-cluster-k8s-minor-version=19

# Phase:  Completed
# Errors:    0
# Warnings:  0
# Namespaces:
#   Included:  *
#   Excluded:  <none>
# Resources:
#   Included:        *
#   Excluded:        <none>
#   Cluster-scoped:  auto
# Label selector:  app=java-maven
# Storage Location:  default
# Velero-Native Snapshot PVs:  auto
# TTL:  720h0m0s
# Hooks:  <none>
# Backup Format Version:  1.1.0
# Started:    2021-08-06 19:47:57 +0800 CST
# Completed:  2021-08-06 19:47:59 +0800 CST
# Expiration:  2021-09-05 19:47:57 +0800 CST
# Total items to be backed up:  13
# Items backed up:              13

# Resource List:
#   apps/v1/ControllerRevision:
#     - default/deploy-java-maven-7664b769
#   apps/v1/StatefulSet:
#     - default/deploy-java-maven
#   v1/Endpoints:
#     - default/deploy-maven-svc
#   v1/PersistentVolume:  # 可以看見備份的 PV 相關資訊
#     - pvc-0a2c5013-db49-43f7-9e5f-5b29730b7938
#     - pvc-0c77d4da-f703-4a58-bee2-0ce25d3e8630 
#     - pvc-563bcd3c-d994-4e46-8d4e-50694706366e
#   v1/PersistentVolumeClaim:
#     - default/logs-deploy-java-maven-0
#     - default/logs-deploy-java-maven-1
#     - default/logs-deploy-java-maven-2
#   v1/Pod:
#     - default/deploy-java-maven-0
#     - default/deploy-java-maven-1
#     - default/deploy-java-maven-2
#   v1/Service:
#     - default/deploy-maven-svc

# Velero-Native Snapshots: <none included>      
Kubernetes進階之應用與持久化資料卷備份遷移實踐
  • Step 4.此時我們模拟當不小心删除我們的​

    ​Java-maven​

    ​應用
# 方式1
kubectl delete sts deploy-java-maven
  statefulset.apps "deploy-java-maven" deleted

# 方式2
kubectl delete -f HelloWorld.yaml
service "deploy-maven-svc" deleted
  statefulset.apps "deploy-java-maven" deleted      
  • Step 5.利用velero來恢複我們的​

    ​Java-maven​

    ​應用
velero restore create --from-backup java-maven
# Restore request "java-maven-20210806204045" submitted successfully.
# Run `velero restore describe java-maven-20210806204045` or `velero restore logs java-maven-20210806204045` for more details.

velero restore get
# java-maven-20210806204045   java-maven   Completed   2021-08-06 20:40:45 +0800 CST   2021-08-06 20:40:46 +0800 CST   0        0          2021-08-06 20:40:45 +0800 CST   <none>      
  • Step 6.恢複後驗證我們的​

    ​Java-maven​

    ​應用是否正常。
kubectl get all -l app=java-maven
# NAME                      READY   STATUS    RESTARTS   AGE
# pod/deploy-java-maven-0   1/1     Running   0          64s
# pod/deploy-java-maven-1   1/1     Running   0          64s
# pod/deploy-java-maven-2   1/1     Running   0          64s

# NAME                       TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
# service/deploy-maven-svc   NodePort   10.111.226.31   <none>        8080:30089/TCP   64s

# NAME                                 READY   AGE
# statefulset.apps/deploy-java-maven   3/3     64s

# kubectl get pv,pvc -l app=java-maven
# NAME                                             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
# persistentvolumeclaim/logs-deploy-java-maven-0   Bound    pvc-0a2c5013-db49-43f7-9e5f-5b29730b7938   1Gi        RWO            managed-nfs-storage   73s
# persistentvolumeclaim/logs-deploy-java-maven-1   Bound    pvc-0c77d4da-f703-4a58-bee2-0ce25d3e8630   1Gi        RWO            managed-nfs-storage   73s
# persistentvolumeclaim/logs-deploy-java-maven-2   Bound    pvc-563bcd3c-d994-4e46-8d4e-50694706366e   1Gi        RWO            managed-nfs-storage   73s      
Kubernetes進階之應用與持久化資料卷備份遷移實踐

0x0n 入坑出坑

1.采用Velero 1.6.2 提供得官方資源清單部署後從無法通路 ​

​MINIO Web-UI​

​ 管理界面

  • 問題資訊:
$ kubectl logs -n velero pod/minio-5b84955bdd-ptfs7
WARNING: MINIO_ACCESS_KEY and MINIO_SECRET_KEY are deprecated.
         Please use MINIO_ROOT_USER and MINIO_ROOT_PASSWORD
API: http://192.168.109.99:9000  http://127.0.0.1:9000

Console: http://192.168.109.99:35735 http://127.0.0.1:35735

Documentation: https://docs.min.io

WARNING: Console endpoint is listening on a dynamic port (35735), please use --console-address ":PORT" to choose a static port.      
  • 問題原因:
# 原因1.由上述得警告可知傳遞得minio賬号密碼得變量已變成如下,主要如不設定則預設credentials為'minioadmin:minioadmin'
MINIO_ROOT_USER and MINIO_ROOT_PASSWORD

docker run -p 30090:9000 \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=password" \
  minio/minio server /data

# 原因2.Console 端口預設是動态随機端口需要采用如下參數進行指定。
--console-address ":PORT"      
  • 解決辦法:
containers:
  - name: minio
    image: minio/minio:latest
    imagePullPolicy: IfNotPresent
    args:
    - server
    - /storage
    - --console-address 
    - ":31234"
    - --config-dir=/config
# 關鍵點1
    env:
    - name: MINIO_ROOT_USER
      value: "minio"
    - name: MINIO_ROOT_PASSWORD
      value: "minio123"
# 關鍵點2
    ports:
    - name: web
      containerPort: 9000
    - name: console
      containerPort: 31234
    volumeMounts:
    - name: storage
      mountPath: "/storage"
    - name: config
      mountPath: "/config"      

繼續閱讀