- 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,主要有兩步流程:
- 執行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"
- 執行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 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