K8s 用戶需要很了解所用到的網路儲存系統的配置細節才能完成Volume配置, 由於要研究的配置很多, 所以K8s設計了Persistent Volume來將儲存系統和管理解耦, 它是位於用戶和管理員之間的抽象層。
Persistent Volume(PV)是由管理員配置在儲存系統上的一段儲存空間, 它將共享儲存數據做為一種可由用戶申請使用的資源, 實現“儲存消費”的機制, 用戶要對PersistentVolumeClaim(PVC)提出申請使用PV的請求, PVC會向PV申請特定大小的空間和訪問模式再創建出PVC Volume, 最後再由Pod 通過PVC做關聯。

spec字段:
Retain, Recycle, Delete, 預設Retain
NFS, hostPath支援Filesystem
空, 不屬於任何StorageClass。各類型PV支持的訪問模式可參考官網
YAML 部署
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs-001
  lables:
    release: stable
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistenVolumeRecliamPolicy: Recycle
  storageClassName: slow
  mountOptions:
  - hard
  - nfsvers=4.1
  nfs:
    path: "/webdata/htdocs"
    server: nfs.ilinux.io
查看結果
-> % kubectl get pv pv-nfs-001
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-nfs-001   5Gi        RWX            Retain           Available           slow
STATUS會有幾種結果:
Available: 可用狀態的自由資源, 尚未被PVC綁定Bound:  已經綁定到某個PVCReleased: 綁定的PVC已被刪除, 但資源尚未被回收Failed: 自動回收資源失敗而處於故障狀態PVC和PV是一對一的關係, 它透過用戶申請要佔用某個PV而創建
spec字段包含:
accessMode: PVC的訪問模式, 可用模式同PVresources: volume需要的最小資源設定selector: 綁定PV要使用的標籤選擇器(matchLabels)或正則式(matchExpressions)storageClassName: 所屬的StorageClass名稱volumeMode: 指定volume可被當作文件系統使用或只能使用原本的區塊設備, 預設Filesystem
volumeName: 指定要綁定的PV名稱YAML 部署
  apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: pvc-nfs-001
    labels:
      release: stable
  spec:
    accessModes:
    - ReadWriteMany
    volumeMode: Filesystem
    resources:
      requests:
        storage: 5Gi
    storageClassName: slow
    selector:
      matchLabels:
        release: stable
查看結果
-> % kubectl get pvc
NAME          STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-nfs-001   Pending                                      slow           72s
綁定PVC之後, Pod就可以使用到PV的數據, Pod引用PVC時只能使用同一個Namespace的資源。
在Pod中使用PVC
pod spec 加上兩個字段即可使用PVC
1.claimName: 要調用的PVC名稱
2.readOnly: 是否將volume強制掛載成唯讀模式, 預設false
YAML範例
  apiVersion: v1
  kind: Pod
  metadata:
    name: pod-nfs
  spec:
    containers:
    - name: redis
      image: redis:4-apline
      ports:
      - containerPort: 6379
      volumeMounts:
      - mountPath: /data
        name: redis-1
    volumes:
    - name: redis-1
      persistentVolumeClaim:
        claimName: pv-nfs-001
StorageClass 是為了讓管理員方便管理PV和PVC所創建出來的類別, 管理員可按照性能高低分類或是根據備份策略分類。StorageClass可以支援PV動態創建,提高PV運用的靈活性。

metadate.name。provisioner: 提供儲存資源的系統, 用在將儲存插件調用到目標儲存系統, k8s內建的都以kubernetes.io為前綴, 也開放用戶依據規範自行定義parameters: 描述要關聯的Volume的參數reclaimPolicy: 指定動態創建的PV回收策略, 可用Delete和Retain, 預設Retain
volumeBindingMode: 定義如何為PVC完成供給與綁定, 預設VolumeBindingImmediate; 此設定只在啟用Volume調度功能才生效mountOptions: 動態創建的PV掛載選項列表Provisioning:
Provisioning 是指為PVC準備可用的PV的機制。K8s提供兩個機制:靜態供給和動態供給。
Binding:
用戶定義好PVC之後, k8s會為其查找匹配的PV建立兩邊的關聯, 再把兩邊的狀態調整為"Binding"。如果PVC一直無法找到匹配的PV, 則狀態會是"unbound"
Reclaiming
Volume完成任務後即可刪除PVC回收資源, 回收策略取決於PV的定義:"Retained", "Recycled" ,"Deleted"。
Resizing
安裝好PersistentVolumeClaimResize插件之後才能使用PVC擴展機制, 在支援擴展PVC的Volume部署spec時將allowVolumeExpansion設置為true 即可動態擴展Volume空間
今天先到這裡了, 明天會來讀常用的ConfigMap 和 Secret, 他們也是Volume的一種!