iT邦幫忙

2022 iThome 鐵人賽

DAY 18
1
DevOps

30天準備CKA考試系列 第 18

Day 18:Persistent Volumes

  • 分享至 

  • xImage
  •  

簡稱PV。昨天有提到Volume可以想像成Pod的外接儲存空間,那PV就可以想像成在集群中的一顆硬碟。它可能是存在集群中的Node上,也有可能並不在集群中。

Persistent Volume Claims

簡稱PVC,如果PV算是一顆硬碟,那PVC就是我們用這個硬碟所建立的Partition。PV和PVC是一對一的關係,擁有排他性,在ClaimRef中會記錄兩者的綁定關係。

如果建立PVC時,找不到符合條件的PV,那PVC就會一直處於未綁定狀態,直到出現符合條件的PV。可能會因為PV容量小於PVC請求之容量等原因所造成。

此外,當Pod正在Mount PVC時,因為避免資料遺失,這時的PVC是無法被刪除的。

靜態建立PV

有分為靜態和動態:

  • 靜態:就是指先建立PV,再讓PVC去認領。
  • 動態:在建立PVC時,透過StorageClass來動態產生符合條件的PV。

接下來我們看看要如何用YAML建立PV:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
	persistentVolumeReclaimPolicy: Delete
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
  • storageClassName:這邊是用來讓PVC來與PV做綁定時辨認的,不一定真的需要名叫manual的StorageClass。
  • capacity:指定這個PV的大小。
  • accessModes:這個PV的讀寫權限。
  • hostPath:和之前在Volumes提到的一樣,使用這個Pod所在的Node的某個位置來提供儲存資源。
  • persistentVolumeReclaimPolicy:當PVC被刪除後,PV以及其相關資源,如AWS EBS,會一起被清除。

這邊有一個設定沒談到,它就是volumeMode:它有支援Filesystem和Block。預設為Filesystem。

我在過去實驗時有發現,當我們使用hostPath來建立PV時,capacity所設定的儲存空間大小,在實際上應用時,還是要依據這個位置本身有多少空間為主。

舉例來說,我使用hostPath在有100Gi的位置建立了10Gi的PV和PVC,然後提供給Pod使用。這時候Pod可以在volumeMounts可以使用的空間會是100Gi,而非10Gi。

AccessModes

早期的版本中有分為三種:

  • ReadWriteOnce:RWO,只允許一個Node以讀寫權限Mount,而這個Node則可以有多個Pod訪問這個PVC。

  • ReadOnlyMany:ROX,允許多個Node以只讀權限Mount。

  • ReadWriteMany:RWX,允許多個Node以讀寫權限Mount。

  • ReadWriteOncePod:RWOP,只允許一個Pod以讀寫權限Mount。在v1.22以後開始支援,且只支援CSI類型,CSI是一種標準的interface,讓其他廠商設計自己的儲存服務。

ReclaimPolicy

有分為三種:

  • Retain:當PVC被刪除時,PV會保存下來並把狀態顯示為Released,不允許其他PVC認領。可透過清除ClaimRef來讓新的PVC認領。
  • Delete:同之前所說,當PVC被刪除後,PV以及其相關資源,如AWS EBS,會一起被清除。
  • Recycle:目前已被棄用。當PVC被刪除後,PV內的資料會被清空,允許其他PVC認領。

建立PVC

在建立PVC時,系統會根據我們設定的PVC條件,來尋找相對應的PV,如果不符合則無法綁定。

條件主要分為:

  • accessModes
  • resources
  • storageClassName:當值為””空字串時,會被視為只認領未設置storageClassName的PV。
  • selector:有分為matchLabels和matchExpressions,這邊就和之前介紹Label的作法一樣。
  • volumeMode
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
	volumeMode: Filesystem
  resources:
    requests:
      storage: 8Gi
  storageClassName: manual
  selector:
    matchLabels:
      release: "stable"
    matchExpressions:
      - {key: environment, operator: In, values: [dev]}

PVC的大小是否可以改變?

有幾種特定類型的PVC是支援擴張大小的,需要在StorageClass中將allowVolumeExpansion設為true才允許。我們只需編輯PVC,將容量改為更大,系統會自動調整PV。至於哪些類型支援擴張大小的,可以參考持久卷

內容比想像中的多QQ,明天再來討論怎麼使用PVC以及StorageClass~

參考資料

持久卷

配置 Pod 以使用 PersistentVolume 作为存储


上一篇
Day 17:Volume
下一篇
Day 19:Storage Class
系列文
30天準備CKA考試30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言