Velero 作為 Kubernetes 叢集備份和還原的利器,其操作流程涉及多個環節。從佈署 MinIO 作為 S3 相容的儲存後端開始,接著安裝和組態 Velero,並利用其 CLI 工具進行一次性或排程的備份作業。文章中詳細說明瞭如何設定備份選項,例如指定名稱空間和資源型別,以及如何監控備份狀態。此外,還演示瞭如何從備份中還原名稱空間,以及如何在新的 Kubernetes 叢集中使用現有備份來快速重建應用環境。這些步驟涵蓋了 Velero 的核心功能,讓讀者能快速上手並應用於實際場景。

介紹與設定 Heptio’s Velero

佈署 MinIO

MinIO 是一種開放原始碼的物件儲存解決方案,與 Amazon 的 S3 雲端服務 API 相容。您可以從其 GitHub 儲存函式庫(https://github.com/minio/minio)瞭解更多關於 MinIO 的資訊。

在從網際網路使用 manifest 佈署 MinIO 時,請務必驗證佈署中宣告的卷宗是否正確,然後再將其用作備份位置。網際網路上的許多示例使用 emptyDir: {}, 這不是持久的。

佈署 MinIO 伺服器

我們在 chapter13 資料夾中包含了來自 Velero GitHub 儲存函式庫的修改後的 MinIO 佈署。由於我們的叢集具有永續性儲存,我們編輯了佈署中的卷以使用 PersistentVolumeClaims(PVC),這將使用自動組態程式進行 Velero 的資料和組態。

要佈署 MinIO 伺服器,請將目錄更改為 chapter13 並執行 kubectl create 命令:

kubectl create -f minio-deployment.yaml

這將在 KinD 叢集上佈署 MinIO 伺服器,並將其暴露為 minio,連線埠為 9000/TCP。

暴露 MinIO 控制檯

MinIO 包含一個控制檯,允許您瀏覽伺服器上 S3 儲存桶的內容。要允許存取控制檯,您可以佈署一個 Ingress 規則,暴露 MinIO 服務。我們在 chapter13 資料夾中包含了一個示例 Ingress manifest。您可以使用包含的檔案建立它,或從以下 manifest 建立:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: minio-ingress
  namespace: velero
spec:
  rules:
  - host: minio.[hostip].nip.io
    http:
      paths:
      - path: /
        backend:
          serviceName: minio
          servicePort: 9000

組態 MinIO

佈署後,您可以在任何機器上使用瀏覽器開啟您用於 Ingress 規則的 URL。在我們的叢集中,主機 IP 是 10.2.1.121,因此我們的 URL 是 minio.10.2.1.121.nip.io

建立 S3 目標組態

  1. 在 chapter13 資料夾中建立一個名為 credentials-velero 的新憑據檔案:
vi credentials-velero
  1. 將以下行新增到憑據檔案中並儲存檔案:
[default]
aws_access_key_id = packt
aws_secret_access_key = packt

使用 Velero 安裝和組態

現在,我們可以使用 Velero 可執行檔和安裝選項來佈署 Velero。

  1. 從 chapter13 資料夾內執行以下命令來佈署 Velero:
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.1.0 \
--bucket velero \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.velero.svc:9000

Velero 安裝選項說明

選項說明
--provider aws指定雲端服務提供者
--plugins velero/velero-plugin-for-aws:v1.1.0指定 Velero 外掛程式
--bucket velero指定 S3 儲存桶名稱
--secret-file ./credentials-velero指定憑據檔案路徑
--use-volume-snapshots=false停用卷快照
--backup-location-config指定備份位置組態

使用 Velero 備份工作負載

Velero 支援執行一次性備份或按排程進行備份。無論您選擇執行一次性備份還是排程備份,您都可以備份所有物件或僅備份某些物件,使用包含和排除標誌。

執行一次性叢集備份

要建立初始備份,您可以執行單個 Velero 命令,該命令將備份叢集中的所有名稱空間。

執行備份時不包含任何標誌以包含或排除任何叢集物件,將備份每個名稱空間和名稱空間中的所有物件。

要建立一次性備份,請執行 velero 命令,並使用 backup create <備份名稱> 選項。在我們的示例中,我們將備份命名為 initial-backup

velero backup create initial-backup

這將提交備份請求並傳回確認訊息:

Backup request "initial-backup" submitted successfully.
Run `velero backup describe initial-backup` or `velero backup logs initial-backup` for more details.

您可以使用 velero 命令,並使用 backup describelogs 選項來檢查備份狀態和日誌。

Velero CRD 和 Secret 物件說明

當您執行安裝時,您將看到建立了許多物件,包括許多自定義資源定義(CRD)和秘密,Velero 使用這些來處理備份和還原操作。

物件說明
Backup備份物件
Restore還原物件
Schedule排程物件
Config組態物件

瞭解這些物件及其功能有助於您在沒有存取 Velero 可執行檔的情況下檢視或更改物件值以快速解決問題。

使用 Velero 備份工作負載

詳細描述備份作業

使用 describe 選項可以顯示備份作業的所有詳細資訊: 如同圖 13.5 所示,describe 選項顯示了備份作業的所有設定。由於我們沒有在備份請求中傳遞任何選項,因此該作業包含了所有的名稱空間和物件。其中一些最重要的詳細資訊包括階段、要備份的總專案以及已備份的專案。

檢查備份狀態

如果階段的狀態不是 success,則備份可能不包含所有所需的專案。檢查已備份的專案數量也很重要,如果已備份的專案數量少於要備份的專案,則備份並未包含所有專案。

使用 kubectl 描述備份資源

即使沒有安裝 Velero 可執行檔,也可以使用 kubectl describe 命令來檢視備份物件的狀態:

kubectl describe backups initial-backup -n velero

此命令將顯示備份的狀態,包括階段、開始和完成時間,以及已備份的物件數量。

排程叢集備份

建立一次性備份對於有排程的叢集操作或名稱空間中的主要軟體升級非常有用。然而,為了定期備份叢集,我們需要建立排程備份。

建立排程備份

使用 schedule 選項和 create 命令可以建立排程備份,同時需要提供作業名稱和排程標誌,該標誌接受根據 cron 的表示式。以下範例使用 cron 表示式建立每天凌晨 1 點的備份:

velero schedule create cluster-daily --schedule="0 1 * * *"

Velero 將回應排程已成功建立。

cron 表示式說明

圖表翻譯: 此圖示說明瞭 cron 表示式的結構,包括分鐘、小時、日期、月份和星期。

使用簡寫排程表示式

cron 也接受一些簡寫表示式,使得排程更加容易。例如,使用 @daily 簡寫表示式可以建立每天凌晨執行的備份作業:

velero schedule create cluster-daily --schedule="@daily"

排程作業將在執行時建立備份物件,備份名稱將包含排程名稱、日期和時間。

自訂備份

建立備份作業時,可以提供旗標來自訂要包含或排除的物件。常見的旗標包括 --include-namespaces--exclude-namespaces 等。

建立自訂排程備份

以下範例使用 --include-namespaces 旗標建立每天執行並僅包含 Kubernetes 系統名稱空間的排程備份:

velero schedule create cluster-ns-daily --schedule="@daily" --include-namespaces ingress-nginx,kube-node-lease,kube-public,kube-system,local-path-storage,velero

使用 CLI 管理 Velero

目前,所有 Velero 操作都必須使用 Velero 可執行檔來完成。雖然一開始可能會有些挑戰,但熟悉 Velero 管理命令後,操作將變得更加容易。

Velero 命令和旗標

Velero 可執行檔接受兩種型別的選項:命令和旗標。命令是諸如 backuprestoreinstallget 等操作。大多數初始命令需要第二個命令來構成完整的操作。

命令型別
  • backup:備份操作
  • restore:還原操作
  • install:安裝操作
  • get:取得資源操作
旗標型別
  • 全域旗標:可以設定於任何命令的旗標。
  • 命令旗標:特定於所執行的命令的旗標。

詳細說明:使用 CLI 管理 Velero 的重要性

使用 CLI 管理 Velero 需要熟悉各種命令和旗標。這種管理方式雖然一開始可能較為困難,但一旦熟悉相關命令後,將能夠更靈活地進行各種操作。

內容解密:

本文詳細介紹瞭如何使用 Velero 的 CLI 進行備份和還原操作的管理。透過瞭解不同的命令和旗標,可以更好地利用 Velero 的功能來保護叢集資料。

使用 Velero 管理 Kubernetes 備份與還原

Velero 是一款強大的開源工具,用於備份和還原 Kubernetes 叢集資源和持久性儲存區。它提供了豐富的命令列介面(CLI)來管理備份、還原、排程和其他相關操作。本篇文章將介紹如何使用 Velero 的 CLI 來管理備份和還原任務。

取得 Velero 指令幫助

Velero 的 CLI 提供了內建的幫助系統,可以使用 -h 旗標來查詢任何指令的語法和可用選項。

velero backup create -h

上述指令將顯示 backup create 指令的幫助資訊,包括可用的旗標和選項。

常用的 Velero 指令

以下是一些常用的 Velero 指令,用於管理備份和還原任務:

  • get:列出 Velero 物件,例如備份、還原、排程等。
  • describe:顯示特定 Velero 物件的詳細資訊。
  • create:建立新的 Velero 物件,例如備份、還原、排程等。
  • delete:刪除特定的 Velero 物件。

列出 Velero 物件

使用 get 指令可以列出各種 Velero 物件,例如備份、還原、排程等。

velero get backups

上述指令將列出所有備份物件。

顯示 Velero 物件詳細資訊

使用 describe 指令可以顯示特定 Velero 物件的詳細資訊。

velero describe backup cluster-daily-20200627175009

上述指令將顯示名為 cluster-daily-20200627175009 的備份物件的詳細資訊。

建立和刪除 Velero 物件

使用 create 指令可以建立新的 Velero 物件,例如備份、還原、排程等。

velero backup create initial-backup

上述指令將建立一個名為 initial-backup 的備份物件。

使用 delete 指令可以刪除特定的 Velero 物件。

velero delete backup day2

上述指令將刪除名為 day2 的備份物件。

從備份還原

使用 create restore 指令可以從備份還原 Kubernetes 物件。

velero restore create --from-backup initial-backup

上述指令將從名為 initial-backup 的備份還原 Kubernetes 物件。

檢視還原狀態

使用 describe 指令可以檢視還原作業的狀態。

velero restore describe initial-backup-20200627194118

上述指令將顯示名為 initial-backup-20200627194118 的還原作業的狀態。

例項演練

以下是一個簡單的演練,示範如何使用 Velero 備份和還原 Kubernetes 佈署。

  1. 建立一個簡單的 NGINX 網頁伺服器佈署。
  2. 驗證佈署是否正常運作。
  3. 刪除佈署。
  4. 使用 Velero 從備份還原佈署。
  5. 驗證還原是否成功。

建立 NGINX 佈署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

使用 Plantuml 圖表呈現流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Velero Kubernetes 備份還原實戰

package "Kubernetes Cluster" {
    package "Control Plane" {
        component [API Server] as api
        component [Controller Manager] as cm
        component [Scheduler] as sched
        database [etcd] as etcd
    }

    package "Worker Nodes" {
        component [Kubelet] as kubelet
        component [Kube-proxy] as proxy
        package "Pods" {
            component [Container 1] as c1
            component [Container 2] as c2
        }
    }
}

api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2

note right of api
  核心 API 入口
  所有操作經由此處
end note

@enduml

圖表翻譯: 此圖表呈現了使用 Velero 備份和還原 Kubernetes 佈署的流程。首先,建立一個 NGINX 佈署並驗證其運作。然後,刪除佈署並使用 Velero 從備份還原佈署。最後,驗證還原是否成功。

本篇文章介紹瞭如何使用 Velero 的 CLI 管理備份和還原任務,包括列出 Velero 物件、顯示物件詳細資訊、建立和刪除物件,以及從備份還原 Kubernetes 物件。透過例項演練,讀者可以瞭解如何使用 Velero 來保護 Kubernetes 叢集中的資源。

使用 Velero 進行 Kubernetes 工作負載的備份與還原

在前面的章節中,我們已經介紹了 Velero 的安裝和基本組態。在本文中,我們將探討如何使用 Velero 進行 Kubernetes 工作負載的備份和還原。

佈署測試環境

首先,我們需要在 Kubernetes 叢集中佈署一個測試環境。我們提供了一個佈署檔案 nginx-deployment.yaml,位於 GitHub 倉函式庫的 chapter13 資料夾中。

  1. 編輯 nginx-deployment.yaml 檔案,將 nip.io 網址中的 IP 地址替換為您的主機 IP 地址。

spec: rules:

  • host: nginx-lab.<您的主機IP>.nip.io
2. 使用 `kubectl` 佈署該檔案:
   ```bash
kubectl apply -f nginx-deployment.yaml

這將建立所需的物件,包括名稱空間、NGINX 佈署、服務和 Ingress 規則。

  1. 驗證佈署是否成功:
    • 使用瀏覽器開啟 Ingress 規則中指定的 URL,確認 NGINX 正在執行。

內容解密:

  • 編輯 nginx-deployment.yaml 是為了確保 Ingress 規則能夠正確解析到您的主機 IP。
  • 使用 kubectl apply 命令佈署檔案,可以建立多個 Kubernetes 物件。
  • 驗證 NGINX 是否執行是為了確保佈署成功。

使用 Velero 備份名稱空間

現在,我們將使用 Velero 建立一個一次性備份。

  1. 使用 velero create backup 命令建立備份:

velero create backup nginx-lab –include-namespaces=nginx-lab

2. 驗證備份是否成功完成:
   ```bash
velero backup describe nginx-lab

確保階段狀態顯示為 Completed

內容解密:

  • --include-namespaces 引數指定了要備份的名稱空間。
  • velero backup describe 命令用於檢查備份的詳細資訊和狀態。

模擬故障並還原名稱空間

接下來,我們將模擬一個故障場景:刪除整個名稱空間。

  1. 使用 kubectl delete ns 命令刪除名稱空間:

kubectl delete ns nginx-lab

2. 驗證 NGINX 服務是否不可用:
   - 在瀏覽器中重新整理或開啟之前的 URL,應該會收到錯誤訊息。

3. 使用 Velero 從備份中還原名稱空間:
   ```bash
velero create restore --from-backup nginx-lab
  1. 驗證還原是否成功:

velero restore describe <還原任務名稱>

   確保階段狀態顯示為 `Completed`,並檢查 NGINX 是否已還原執行。

#### 內容解密:
- `velero create restore` 命令用於從指定的備份中還原資料。
- 使用 `velero restore describe` 可以檢視還原任務的詳細資訊和狀態。

### 在新叢集中使用備份

Velero 不僅可以用於還原資料到同一個叢集,也可以將備份用於在新的叢集中還原工作負載。

1. 在當前叢集中建立多個名稱空間和佈署:
   ```bash
kubectl create ns demo1
kubectl create ns demo2
kubectl create ns demo3
kubectl create ns demo4
kubectl run nginx --image=bitnami/nginx -n demo1
kubectl run nginx --image=bitnami/nginx -n demo2
kubectl run nginx --image=bitnami/nginx -n demo3
kubectl run nginx --image=bitnami/nginx -n demo4
  1. 使用 Velero 建立這些名稱空間的備份:

velero backup create namespace-demo –include-namespaces=demo1,demo2,demo3,demo4


3. 建立一個新的 KinD 叢集:
   ```bash
kind create cluster --name velero-restore
  1. 切換到新的叢集上下文:

kubectl config get-contexts

   確認當前上下文已切換到 `kind-velero-restore`。

5. 在新叢集中使用 Velero 從備份中還原工作負載。

#### 內容解密:
- 在新叢集中使用備份之前,需要確保 Velero 已安裝並組態好。
- 切換叢集上下文是為了確保在正確的叢集中執行還原操作。