Longhorn — 雲原生儲存系統試玩(下)

Jan 21, 2022 John Chung

Photo by Alvaro Reyes on Unsplash

Photo by Fernando Lavin on Unsplash

延續 Longhorn — 雲原生儲存系統試玩(中)的文章,本篇將繼續說明透過 longhorn 進行快照後,相關應用以及 longhorn 的進階用法。

快照回滾

當我們想要取得舊的快照中的資料時,可以將目前的 volume 回滾到快照當時的狀態。不過要將資料回滾必須先把 volume 以維護模式掛載到節點上。與擴充容量時一樣,需先將 volume 從目前使用中的 Pod 中卸載。只是在刪除掉 Pod 之前,讓我們先進到 Pod 裡確認一下目前資料的狀態:

然後再將這個 Pod 刪除掉。接著把這個 volume 掛載到任意一個節點上。記得要選擇以 Maintenance 模式掛載。

掛載上去後指定一個你想回溯的快照,點選 Revert,就會將目前的 volume 回溯到指定的狀態。

從圖中可看到現在 volume 的資料是指向剛剛所選定的快照。確認回溯完成後將 volume 再次卸載。

現在重新建立一個 Pod 並且把 volume 掛載上去,可以看到 volume 裡的資料已經變回指定快照的狀態。

從備份回復

除了快照回滾之外,我們也可以透過備份檔案重新將 volume 建立回來。

首先進到 Backup 頁面,可以看到有哪些 volume 存有備份檔案。可以選擇直接以最新的備份回復,或是點進選定的 volume,再從備份清單中另外指定回復的備份來源。

把回復的 volume 名稱、副本數量等資料填好後按下確認就可以在 Volume 頁面看到回復好的 volume。

雖然將 volume 建立回來了,可是從 UI 建立出來的 volume 不會有 PersistentVolume、PersistentVolumeClaim 可供 Pod 使用。所以我們還需要再幫這個 volume 補建這兩個物件。

點選 Create PV/PVC,填好 PersistentVolume 和 PersistentVolumeClaim 的名稱,以及要建立在哪個 namespace 之後,就能夠在 Kubernetes 上看到建立好的物件。

從 UI 建立出來的 PersistentVolume 和 PersistentVolumeClaim 並非動態建立的,因此若是需要刪除 volume,就必須手動將 PersistentVolume、PersistentVolumeClaim,以及 volume 本身刪除。

定時工作

不管是快照還是備份,到目前為止都還是採用手動的方式操作。但若總是都得由人工觸發的話不僅麻煩,而且也很難確保隨時都有可用的快照或備份能夠使用。所以 Longhorn 也支援設定自動化工作,定時執行快照或備份。

要對一個 volume 設定自動化快照 (或備份),首先需在 UI 上點選指定 volume 進到 details 頁面。接著在下方的 Recurring Snapshot and Backup Schedule 區塊中按 + New 新增一個工作。定時工作有分快照 (Snapshot) 和備份 (Backup) 兩種類型。選擇好類型後,再設定觸發間隔時間。時間設定是使用 Crontab 格式。然後是設定保留數量,當快照 (或備份) 的數量超過設定數量的話,就會將最舊的一筆資料刪除。全部設定好之後按下 Save 即可。

自動快照 (或備份) 只有在 volume 資料更新後才會建立新的,所以不用擔心重複內容的快照 (或備份) 佔用住所有的保留數量。

在 Kubernetes 上可以看到 Longhorn 為設定好的工作建立了相對應的 CronJob。

$ kubectl -n longhorn-system get cronjob


雖然已經知道怎麼設定自動化工作了,但若每次建立 volume 後都要自己設定這些還是會很麻煩。因此如果可以在建立 volume 的時候就自動設定好排程的話那就更完美了。

所以這邊就再簡單地講解如何調整安裝時的設定,讓 volume 建立出來的時候就會自動設定好排程:

  1. 透過 Kubectl 使用 Manifest File 安裝

打開 longhorn.yaml 找到 recurringJobs 欄位,會看到這一段已經被註解。只要把註解拿掉,然後依照自己的需求調整觸發時間 (cron) 及保留數量 (retain) 即可。

...
recurringJobs: '[{"name":"snap", "task":"snapshot", "cron":"0 0 * * *", "retain":20},
                  {"name":"backup", "task":"backup", "cron":"0 0 * * *", "retain":20,
                   "labels": {"interval":"2m"}}]'
...
  1. 透過 Helm Chart 安裝

開啟 longhorn 目錄下的 values.yaml,找到 recurringJobs,將底下的 enable 改為 true,jobList 按照 manifest file 同樣的設定方式寫好後,再用 helm 部署即可。

...
persistence:
  defaultClass: false
  defaultClassReplicaCount: 1
  reclaimPolicy: Delete
  recurringJobs:
    enable: true
    jobList: '[
      {
        "name": "snap",
        "task": "snapshot",
        "cron": "0 0 * * *",
        "retain": 20
      },
      {
        "name": "backup",
        "task": "backup",
        "cron": "0 0 * * *",
        "retain": 20,
        "labels": {"interval":"2m"}
      }
    ]'
...

這個設定只會被套用在由 PersistentVolumeClaim 動態建立出來的 volume 上,直接從 UI 建立的 volume 依舊要自己設定定時工作。

跨節點掛載 (RWX)

除了 ReadWriteOnce (RWO) 之外,其實 Longhorn 也有支援 ReadWriteMany (RWX)。如果建立 PersistentVolumeClaim 時 accessModes 設定為 ReadWriteMany,當 volume 被掛載時,Longhorn 會自動建立一個以 share-manager-<volume_name> 命名的 Pod。volume 會先被掛載到這個 Pod 上,再由這個 Pod 提供 NFS 服務。其它需要用 volume 的 Pod 就會透過 NFS 掛載 volume 從而達到跨節點存取的能力。

$ kubectl -n longhorn-system get po,svc | grep pvc

解除安裝

為了避免解除安裝的動作對 Kubernetes 叢集造成影響,建議先確保任何有使用到 Longhorn volume 的資源 (Deployment、StatefulSet、PersistentVolume…) 都已被清除乾淨。

然後根據先前安裝方式的不同,解除安裝方式也會有些許的差別:

  1. 透過 Kubectl 解除安裝
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.3/uninstall/uninstall.yaml

上面的指令會建立一個 job 執行解除安裝的動作,接著就耐心等待 job 執行結束,不過一般來說是不會等太久。

kubectl get job longhorn-uninstall -w

最後就可以將 Longhorn 相關資源及剛才執行的 job 透過 manifest file 清除。

kubectl delete -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.3/deploy/longhorn.yaml
kubectl delete -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.3/uninstall/uninstall.yaml
  1. 透過 Helm 解除安裝
helm delete longhorn --purge

根據官方文件,使用 helm 解除安裝應該只需要執行上面的指令即可。但是實際操作的時候,發現這樣刪除還是會有殘留的資源。所以最後還是需要手動執行 kubectl delete ns longhorn-system 把剩下的資源連同 namespace 一起刪除掉。

假如在解除安裝的過程中把執行順序搞錯,先執行了

kubectl delete -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.3/deploy/longhorn.yaml

或是其它不明原因導致刪除的進度卡住不會動的狀況 ,可以嘗試執行

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.1.3/uninstall/uninstall.yaml

如果 longhorn-uninstall job 已經建立過,請先刪除原來的 job 後再建立一次。

小結

這次只是簡單地過了一遍 Longhorn 的基本使用方式,除此之外還是有其它東西可以繼續研究。像是設定 Prometheus 和 Grafana 以便監控系統狀態、各種系統錯誤的排查,又或者是寫程式與 Longhorn API 整合等。也許等之後將測試用的 Kubernetes 升級到更新的版本後可以再更深入的研究其它部分。

Reference


雙子星雲端為 CNCF 會員,是 CNCF 所認證的 Kubernetes 服務提供商,在雲端技術擁有十多年以上的經驗,為台灣雲端技術早期>領先者。目前為國家級 AI 雲的軟體及 Kubernetes 技術與服務提供商,更是諸多企業與單位導入容器與管理平台的最佳夥伴。

雙子星雲端除了既有的產品 AI Console 與 Gemini API Gateway 之外,也提供企業諮詢與導入雲原生與 Kubernetes 相關技術服>務,協助企業擁抱 Cloud Natvive,達到數位轉型的目標。


相關文章

回雙子星技術部落格列表

Gemini AI Console

熱門文章


kubernetes professional service

關於我們

雙子星雲端是混合多雲技術的領導者,是國際認證之 KCSP - Kubernetes 服務提供商,同時也為 CNCF 雲原生計算基金會會員。

雙子星的雲端專家擁有 Kubernetes、OpenStack 與 Google Cloud Platform 等多項證照,我們的軟體至今已為上百家機構和數千台的 CPU/GPU 伺服器提供雲端服務。