Kubernetes-PersistentVolumeClaim(PVC)介紹(十九)

1 PVC介紹

??PVC是用戶層面,作為對存儲資源的需求申請,主要包括了存儲空間大小、訪問模式、PV的選擇條件、存儲類別等信息的設(shè)置。

2 PVC的參數(shù)詳解

2.1 PVC的yaml模板

apiVersion: v1
kind: PersistentVolumeClaim
metadata: 
  name: test-pvc1
spec: 
  accessModes: 
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs-stoarge
  selector:
    matchLabels:
      pv: test-pv1

2.2 PVC參數(shù)說明

  1. spec.accessModes:訪問模式;描述用戶應(yīng)用對存儲資源的訪問權(quán)限。
  • RWO:ReadWriteOnce,僅允許單個節(jié)點掛載進(jìn)行讀寫;
  • ROX:ReadOnlyMany,允許多個節(jié)點掛載且只讀;
  • RWX:ReadWriteMany,允許多個節(jié)點掛載進(jìn)行讀寫;
  1. spec.resources.requests.storage:資源請求的存儲大?。?/li>
  2. spec.storageClassName:存儲卷模式,指定一個StorageClass資源對象的名稱,具有特定類別的PV只能與請求了該類別的PVC進(jìn)行綁定;(動態(tài)存儲);當(dāng)然,也可以設(shè)置為spec.storageClassName=“”,未設(shè)置特定類型的PV只能與不請求任何類型的PVC進(jìn)行綁定(靜態(tài)存儲)。
  3. spec.selector.matchLabels: PV的選擇條件,可以通過標(biāo)簽匹配進(jìn)行PV綁定;也可以通過spec.selector.matchExpressions進(jìn)行條件標(biāo)簽描述;

3 PVC的生命周期

$ kubectl get pvc

PVC生命周期

PVC一共也有4個生命周期階段:Available/Bound/Released/Failed

  • Available: 可用狀態(tài),無PV綁定;
  • Bound:綁定狀態(tài),已經(jīng)和某個PV綁定;
  • Released:釋放狀態(tài),被綁定的PV已刪除,資源釋放,但沒有被集群回收;
  • Failed:失敗狀態(tài),自動資源回收失??;

4 PVC的常用命令

  1. 創(chuàng)建(yaml的方式)
    $ kubectl create -f pvc.yaml
  2. 刪除
    $ kubectl delete pvc pvc_name
  3. 查看所有PVC
    $ kubectl get pvc
  4. 查看某個PVC
    $ kubectl get pvc pvc_name
  5. 查看詳情
    $ kubectl describe pvc pvc_name
    注意: 若在某個命名空間下,以上命令可以加上-n ns_name

5 PVC和PV的綁定

5.1 PV和PVC的生命周期

生命周期

by 《k8s 權(quán)威指南》

其實,使用共享存儲就幾步:
Pod(Deployment等配置好PVC)—>PVC—>PV—>存儲資源。

  1. 資源供應(yīng)
    PVC使用存儲資源可以通過靜態(tài)綁定或者動態(tài)綁定,靜態(tài)模式就是集權(quán)管理員預(yù)先創(chuàng)建對應(yīng)的PV對存儲特性進(jìn)行設(shè)置;動態(tài)模式就是集權(quán)管理員預(yù)先創(chuàng)建好StorageClass資源對后端存儲進(jìn)行描述,PVC創(chuàng)建時對存儲類型進(jìn)行聲明,PVC創(chuàng)建后,k8s會自動創(chuàng)建合適的PV與PVC進(jìn)行綁定。

  2. 資源綁定
    創(chuàng)建好PVC后,PVC會在已存在的PV中選擇合適的PV進(jìn)行綁定(可以通過標(biāo)簽進(jìn)行特定綁定,也可以不通過標(biāo)簽,系統(tǒng)會自動選擇合適(容量大小等參數(shù))的PV進(jìn)行綁定。),綁定成功,狀態(tài)變成Bound,且該PV被對應(yīng)的PVC獨占綁定,不可以再被其他PVC綁定,除非該PVC釋放。若在k8s系統(tǒng)中沒有找到合適的PV,則PVC一直處于Pending狀態(tài)。

  3. 資源使用
    在Deployment等資源中,通過spec.template.spec.volumes:進(jìn)行PVC掛載路徑設(shè)置。

spec:
  tempeate:
    spec:
      containers:
        - name: container1
          image: image1
          volumeMounts:
            - name: volume1
              mountPath: /data/dir1
      volumes:
      - name: volume1
        persistentVolumeClaim:
          claimName: pvc1
  1. 資源釋放
    刪除PVC,與該PVC綁定的PV狀態(tài)就會變成“Released”,該PVC在存儲設(shè)備上的數(shù)據(jù)刪除后,對應(yīng)的PV才能與其他的PVC進(jìn)行綁定。

  2. 資源回收
    PV中可以通過spec.persistentVolumeReclaimPolicy設(shè)置回收策略,這個主要用于綁定的PVC刪除后,資源釋放后如何處理該PVC在存儲設(shè)備上寫入的數(shù)據(jù)。

  • Retain:保留,刪除PVC后,PV保留數(shù)據(jù);
  • Recycle:回收空間,刪除PVC后,簡單的清除文件;(NFS和HostPath存儲支持)
  • Delete:刪除,刪除PVC后,與PV相連接的后端存儲會刪除數(shù)據(jù);(AWS EBS、Azure Disk、Cinder volumes、GCE PD支持)

5.2 手動創(chuàng)建pv進(jìn)行綁定

??我們可以通過標(biāo)簽的方式,將pvc綁定到特定的pv上。需要做兩步,一個是pv的yaml標(biāo)簽,另一步是pvc的標(biāo)簽匹配。

靜態(tài)模式

by 《k8s權(quán)威指南》

舉例

  1. pv的yaml需要有metadata.labels進(jìn)行標(biāo)簽標(biāo)記;
    如:
[root@k8s /pv_test]#  vim test_pv1.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv1
  labels:
    pv: test-pv1
spec:
  capacity:
    storage: 2Mi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /date-nfs/k8s
    server: 10.139.12.14
  1. pvc的yaml里需要有spec.selector.matchLabels進(jìn)行標(biāo)簽匹配。
[root@k8s /pvc_test]#  vim test_pvc1.yaml 
#persistent Volume Claim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc1
  namespace: t1
spec:
  #storageClassName: managed-nfs-storage
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi
  selector:
    matchLabels:
      pv: test-pv1
  • 創(chuàng)建pv和pvc
    $ kubectl create -f test_pv.yaml
    $ kubectl create -f test_pvc.yaml

  • 查看pv
    $ kubectl get pv test-pv1

    在這里插入圖片描述

  • 查看pvc
    $ kubectl get pvc test-pvc1

    在這里插入圖片描述

    我們可以看出test-pvc1持久卷聲明綁定到了test-pv1這個持久卷上了。

5.3 動態(tài)卷配置StorageClass

除了pvc綁定手動創(chuàng)建pv的方式,我們還可以通過動態(tài)卷配置StorageClass跳過手動pv的方式。

動態(tài)模式

by 《k8s權(quán)威指南》

  1. 我們先要創(chuàng)建一個StorageClass資源。
[root@k8s /sc_test]#  vim test_storageclass1.yaml 
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: course-nfs-storage
provisioner: fuseim.pri/ifs

  1. 然后在pvc的yaml中增加spec.storageClassName進(jìn)行配置。
[root@k8s /pvc_test]#  vim test_pvc_sc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  accessModes:
  - ReadWriteMany
  storageClassName: course-nfs-storage
  resources:
    requests:
      storage: 1Mi
  • 創(chuàng)建StorageClass和PVC資源
    $ kubectl create -f test_storageclass1.yaml
    $ kubectl create -f test_pv_sc.yaml

  • 查看SC
    $ kubectl get sc course-nfs-storage

    在這里插入圖片描述

  • 查看SC詳情
    $ kubectl describe sc course-nfs-storage

    在這里插入圖片描述

  • 查看PVC
    $ kubectl get pvc test-pvc

    在這里插入圖片描述

  • 查看PV
    $ kubectl get pv

    在這里插入圖片描述

    可以看到一個自動創(chuàng)建的pv,它的策略是Delete,即pvc刪除后會自動刪除。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容