- 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 資源和持久卷(
)中得資料無法進行備份遷移,是以在這樣得場景下我們就需要 Velero 是一個開源工具。
PV/PVC
1.Velero 基礎概述
What: 什麼是 Velero?
答: Velero (以前稱為 Heptio Ark
)是一個開源工具,用于安全備份和恢複、執行災難恢複以及遷移 Kubernetes 叢集資源和持久卷。
Why: 為啥要使用 Velero?
答: Velero 可以讓您、
備份您的叢集并在丢失時恢複
、
将叢集資源遷移到其他叢集
, 詳細解析說明:
将您的生産叢集複制到開發和測試叢集
- 1.災難恢複 : 在基礎設施丢失、資料損壞和/或服務中斷的情況下減少恢複時間。
- 2.資料遷移 : 通過輕松地将 Kubernetes 資源從一個叢集遷移到另一個叢集,實作叢集可移植性。
- 3.資料保護 : 提供關鍵資料保護功能,例如計劃備份、保留計劃以及用于自定義操作的備份前或備份後挂鈎。
Velero 特點: 您可以備份或恢複叢集中的所有對象,也可以按類型、命名空間和/或标簽過濾對象。
- 1.備份叢集 : 使用命名空間或标簽選擇器為整個叢集或叢集的一部分備份 Kubernetes 資源和卷。
- 2.計劃備份 : 設定計劃以定期自動啟動備份。
- 3.備份挂鈎 : 配置備份前和備份後挂鈎,以在 Velero 備份之前和之後執行自定義操作。
How: 你如何使用 Velero?
答: 您可以通過雲提供商或本地運作 Velero, 其元件包括和
在叢集上運作的伺服器
本地運作的指令行用戶端
。
使用
服務進行管理存儲備份在ETCD的資料、使用
Minio
用戶端進行備份和還原操作。
velero
2.Velero 工作原理
描述: 一般得使用Velero主要是從以下三個方面入手。
- 1.按需備份: 将複制的 Kubernetes 對象的 tarball 上傳到雲對象存儲中,調用雲提供商 API 以制作持久卷的磁盤快照(如果指定)。
- 2.計劃備份: 由 Cron 表達式指定在循環間隔備份您的資料,計劃備份以名稱儲存
,其中<SCHEDULE NAME>-<TIMESTAMP>
格式為<TIMESTAMP>
。YYYYMMDDhhmmss
- 3.容災恢複: 該恢複操作可以恢複所有對象和持久卷從先前建立的備份,還原的預設名稱為
, 恢複的對象還包括一個帶有 key <BACKUP NAME>-<TIMESTAMP>
和 value的标簽velero.io/restore-name
<RESTORE NAME>
- 4.備份過期: 可以通過添加标志來指定
參數來設定備份得生存時間(預設30天)。到期後則會删除--ttl <DURATION>
。備份資源、來自雲對象存儲的備份檔案、所有 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
(使用選項禁用快照)。
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
二進制檔案從 Velero 目錄移動到 PATH 中的某個位置。elero
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
。
- 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
檔案, 部署示例 nginx 應用程式。examples/nginx-app/base.yaml
$ 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>
- 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
0x0n 入坑出坑
1.采用Velero 1.6.2 提供得官方資源清單部署後從無法通路 MINIO Web-UI
管理界面
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"