003.DirectPV儲存管理

木二發表於2024-08-23

目錄
  • DirectPV drives管理
    • 先決條件
    • 新增drives
    • 列出drives
    • 標記drives
    • 替換drives
    • 移除drives
    • 暫停drives
    • 修復drives
  • 擴容Volume
    • 線上擴容
    • 刪除Volume
    • 清理殘留Volume
    • 暫停Volume
  • DirectPV drives使用
    • 使用介紹
    • 建立PVC
    • 建立Pod

DirectPV drives管理

先決條件

  • 已安裝DirectPV外掛。
  • 在Kubernetes中已安裝DirectPV CSI驅動程式。

新增drives

將Drives新增到DirectPV中,已用於提供volumes,主要有兩步流程:

  1. 執行discover命令
    discover命令從DirectPV節點探測符合條件的硬碟,並將硬碟資訊儲存在YAML檔案中。

建議仔細檢查YAML檔案,並將select欄位設定為yes或no值,以選擇對應的driver。“Select”欄位預設設定為“yes”。

# kubectl directpv discover

# vim drives.yaml
version: v1
nodes:
    - name: master
      drives:
        - id: 252:16$ud8mwCjPTH8147TysmiQ2GGLpffqUht6bz7NtHqReJo=
          name: vdb
          size: 536870912
          make: ""
          select: "yes"
    - name: node1
      drives:
        - id: 252:16$gGz4UIuBjQlO1KibOv7bZ+kEDk3UCeBneN/UJdqdQl4=
          name: vdb
          size: 536870912
          make: ""
          select: "yes"
  1. 執行init命令初始化
    init命令建立一個請求,將選定的驅動器新增到使用discover命令生成的YAML檔案中。
    由於此過程擦除所選驅動器上的所有資料,錯誤的驅動器選擇將導致永久資料丟失,一定需要謹慎。
# kubectl directpv init drives.yaml

列出drives

需要從DirectPV獲取驅動器資訊,使用list drives命令。

# kubectl directpv list drives

標記drives

對驅動器設定自定義標記,以便於在卷配置中使用。

# kubectl directpv label drives tier=hot        #將標籤'tier'鍵設定為'hot'值

# kubectl directpv label drives tier-           #刪除標籤“tier”

替換drives

替換driver可以在同一節點上更換故障硬碟。
在此過程中,將故障驅動器中的所有卷移動到新驅動器中,然後將故障驅動器從DirectPV中移除。
目前,DirectPV不支援將捲上的資料移動到新驅動器。
可以使用 replace.sh 指令碼執行驅動器更換。。

# replace.sh sdd sdf node1

移除drives

可以移除不包含任何卷的驅動器。

# kubectl directpv remove --drives=vdb --nodes=node1

暫停drives

根據Kubernetes的設計,只有當所有pod都處於執行狀態時,StatefulSet工作負載才處於活動狀態,任何故障驅動器都將阻止statfulset啟動。
DirectPV提供了一個解決方案來掛起故障驅動器,它將以只讀訪問許可權將相應的卷掛載到空的/var/lib/directpv/tmp目錄上,這可以透過執行suspend drives命令來完成。

# kubectl directpv suspend drives af3b8b4c-73b4-4a74-84b7-1ec30492a6f0

掛起的驅動器一旦故障修復就可以恢復,恢復後,相應的卷將使用各自分配的驅動器恢復。
這可以透過使用resume drives命令來完成。

# kubectl directpv resume drives af3b8b4c-73b4-4a74-84b7-1ec30492a6f0

修復drives

在極少數情況下,可以修復故障驅動器上的檔案系統使其可以繼續使用。
作為第一步,必須掛起故障驅動器,然後為它們執行修復命令。

repair命令建立一次性Kubernetes作業,pod名稱為repair-,這些作業在作業完成五分鐘後自動刪除。可以使用kubectl log命令檢視驅動器修復的進度和狀態。

# kubectl directpv suspend drives af3b8b4c-73b4-4a74-84b7-1ec30492a6f0      #掛起驅動器

重新啟動pod,並確保關聯的卷未繫結。

在掛起的驅動器上執行修復命令。

# kubectl directpv repair af3b8b4c-73b4-4a74-84b7-1ec30492a6f0

擴容Volume

線上擴容

DirectPV 支援線上卷擴充套件,擴容過程中使用這些卷的 Pod 不需要重啟。
同時擴充套件相關的 PVC 的大小後是自動完成的。

# kubectl get pvc [PersistentVolumeClaimName] -o yaml > my-file-name.yaml

在PVC中,修改 spec.resources.requests.storage 以更改請求的大小。
應用更改後,PVC 更新,DirectPV 自動增加分配給申請卷的大小。
使用kubectl get pvc [PersistentVolumeClaimName] -o yaml驗證,檢視 status.capacity.storage 以檢視更新後的大小。

刪除Volume

只有當卷處於 Ready 狀態且沒有pod正在使用該卷時,卷才能被刪除。
執行kubectl delete pvc命令觸發刪除 DirectPV 卷,刪除卷將導致資料永久丟失,請確認要刪除的卷。

# kubectl delete pvc sleep-pvc                  #刪除sleep-pvc卷

清理殘留Volume

當 pod 和 Persistent Volume Claims 被強制刪除時,關聯的 DirectPV 卷可能不會被刪除,這將導致卷殘留,使用clean命令刪除殘留卷。

# kubectl directpv clean --all                  #清理殘留卷

暫停Volume

資料丟失:

根據Kubernetes的設計,只有當它的所有pod都處於執行狀態時,StatefulSet工作負載才處於活動狀態,故障卷導致statfulset無法啟動。

DirectPV提供了一種解決方案,透過將失敗的卷掛載到具有隻讀訪問許可權的空/var/lib/directpv/tmp目錄上來掛起它們,這可以透過執行suspend volumes命令來完成。

# kubectl directpv suspend volumes --nodes node-1 --drives dm-3

一旦修復了掛起的卷,就可以恢復它們,恢復後,相應的卷返回使用各自分配的驅動器。

# kubectl directpv resume volumes --nodes node-1 --drives dm-3

提示:如上操作比較危險,可能導致資料丟失,同時如上操作通常用於更換損壞的硬碟。

DirectPV drives使用

使用介紹

卷配置包括使用預設的directpv-min-io storage class 或具有directpv-min-io提供程式的自定義 storage class 製作 persistentvolumecclaim ,由於 storage class 自帶卷繫結模式 WaitForFirstConsumer 。
此模式延遲 PersistentVolume 的卷繫結和供應,直到使用 persistentvolumecclaim 的Pod被建立。將根據Pod的排程約束指定的拓撲來選擇或配置 PersistentVolumes 。

這些包括(但不限於)資源需求、節點選擇器、pod親和和反親和、汙點和容忍,使用卷的pod被排程到排程卷的節點。這確保了對pod的高效能資料訪問。

DirectPV volume 處於 Ready 狀態,表示該卷可以繫結到pod,繫結完成後,該卷設定為 Bound 狀態。

建立PVC

PV宣告必須在persistentvolumecclaim規範中使用特定引數定義。

[root@master01 directpv]# vim directpv-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: directpv-pvc
  namespace: default
spec:
  volumeMode: Filesystem
  storageClassName: directpv-min-io
  accessModes: 
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi

[root@master01 directpv]# kubectl get pvc -o wide
NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGE    VOLUMEMODE
directpv-pvc   Bound    pvc-49c5aeff-0a8f-4a1d-b497-e4cd0af59c7d   100Mi      RWO            directpv-min-io   <unset>                 2m7s   Filesystem

建立Pod

對於WaitForFirstConsumer卷繫結模式,必須定義一個消耗directpv-pvc的pod,下面是一個在/mnt上使用directpv-volume的例子。

[root@master01 directpv]# vim directpv-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: directpv-pod
spec:
  volumes:
    - name: directpv-volume
      persistentVolumeClaim:
        claimName: directpv-pvc
  containers:
    - name: directpv-container
      image: busybox:1.36.1
      args: [/bin/sh, -c, while true; do echo "$(date)" >> /tmp/1.log && sleep 10; done]
      volumeMounts:
        - mountPath: "/tmp"
          name: directpv-volume

[root@master01 directpv]# kubectl get pod -o wide
NAME           READY   STATUS    RESTARTS   AGE    IP           NODE       NOMINATED NODE   READINESS GATES
directpv-pod   1/1     Running   0          2m3s   10.10.5.55   worker01   <none>           <none>

[root@master01 directpv]# kubectl exec -ti directpv-pod -- cat /tmp/1.log
Thu Aug 22 18:16:55 UTC 2024
Thu Aug 22 18:17:05 UTC 2024
Thu Aug 22 18:17:15 UTC 2024
Thu Aug 22 18:17:25 UTC 2024
Thu Aug 22 18:17:35 UTC 2024
Thu Aug 22 18:17:45 UTC 2024
Thu Aug 22 18:17:55 UTC 2024

相關文章