天天看點

【K8S】何為PV與PVC,如何建立,PVC如何綁定到特定的PV上?

PV與PVC的簡介

k8s提供了emptyDir,hostPath,rbd,cephfs等存儲方式供容器使用,(關于常用的emptyDir與hostPath的簡介與差別,可以參考這篇文章​​【K8S】Volume類型-EmptyDir與HostPath的差別​​)。

不過這些存儲方式都有一個缺點:開發人員必須得知指定存儲的相關配置資訊,才能使用存儲。例如要使用cephfs,Pod的配置資訊就必須指明cephfs的monitor、user、selectFile等等,而這些應該是系統管理者的工作。對此,k8s提供了兩個新的API資源:PersistentVolume,PersistentVolumeClaim。

PV(PersistentVolume)是管理者已經提供好的一塊存儲。在k8s叢集中,PV像Node一樣,是一個資源。

PersistentVolume(PV)是叢集中由管理者配置的一段網絡存儲。 它是叢集中的資源,就像節點是叢集資源一樣。 PV是容量插件,如Volumes,但其生命周期獨立于使用PV的任何單個pod。 此API對象捕獲存儲實作的詳細資訊,包括NFS,iSCSI或特定于雲提供程式的存儲系統。

PVC(PersistentVolumeClaim)是使用者對PV的一次申請。PVC對于PV就像Pod對于Node一樣,Pod可以申請CPU和Memory資源,而PVC也可以申請PV的大小與權限。

PersistentVolumeClaim(PVC)是由使用者進行存儲的請求,一種對存儲資源的聲明。 它類似于pod。 Pod消耗節點資源,PVC消耗PV資源。Pod可以請求特定級别的資源(CPU和記憶體)。聲明可以請求特定的大小和通路模式(例如,可以一次讀/寫或多次隻讀)。

有了PersistentVolumeClaim,使用者隻需要告訴Kubernetes需要什麼樣的存儲資源,而不必關心真正的空間從哪裡配置設定,如何通路等底層細節資訊。這些Storage Provider的底層資訊交給管理者來處理,隻有管理者才應該關心建立PersistentVolume的細節資訊。

 PVC和PV是一一對應的。

 雖然PersistentVolumeClaims允許使用者使用抽象存儲資源,但是PersistentVolumes對于不同的問題,使用者通常需要具有不同屬性(例如性能)。群集管理者需要能夠提供各種PersistentVolumes不同的方式,而不僅僅是大小和通路模式,而不會讓使用者了解這些卷的實作方式。對于這些需求,有StorageClass 資源。

  StorageClass為管理者提供了一種描述他們提供的存儲的“類”的方法。 不同的類可能映射到服務品質級别,或備份政策,或者由群集管理者确定的任意政策。 Kubernetes本身對于什麼類别代表是不言而喻的。 這個概念有時在其他存儲系統中稱為“配置檔案”。

建立多個PV與PVC

(1)在master上建立PV

(1)編寫yaml檔案,并建立pv

建立5個pv,存儲大小各不相同,是否可讀也不相同

[root@master volumes]# vim pv-damo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    name: pv001
spec:
  nfs:
    path: /data/volumes/v1
    server: nfs
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
  labels:
    name: pv002
spec:
  nfs:
    path: /data/volumes/v2
    server: nfs
  accessModes: ["ReadWriteOnce"]
  capacity:
    storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    path: /data/volumes/v3
    server: nfs
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 20Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
  labels:
    name: pv004
spec:
  nfs:
    path: /data/volumes/v4
    server: nfs
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
  labels:
    name: pv005
spec:
  nfs:
    path: /data/volumes/v5
    server: nfs
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 15Gi
[root@master volumes]# kubectl apply -f pv-damo.yaml
persistentvolume/pv001 created
persistentvolume/pv002 created
persistentvolume/pv003 created
persistentvolume/pv004 created
persistentvolume/pv005 created      

(2)查詢驗證

[root@master ~]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
pv001     5Gi        RWO,RWX        Retain           Available                                      9s
pv002     5Gi        RWO            Retain           Available                                      9s
pv003     5Gi        RWO,RWX        Retain           Available                                      9s
pv004     10Gi       RWO,RWX        Retain           Available                                      9s
pv005     15Gi       RWO,RWX        Retain           Available                                      9s      

(2)建立PVC,綁定PV

(1)編寫yaml檔案,并建立pvc

建立一個pvc,需要6G存儲;是以不會比對pv001、pv002、pv003

[root@master volumes]# vim vol-pvc-demo.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  namespace: default
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests:
      storage: 6Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: vol-pvc
  namespace: default
spec:
  volumes:
  - name: html
    persistentVolumeClaim:
      claimName: mypvc
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
[root@master volumes]# kubectl apply -f vol-pvc-demo.yaml
persistentvolumeclaim/mypvc created
pod/vol-pvc created      

(2)查詢驗證:pvc已經綁定到pv004上

[root@master ~]# kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc     Bound     pv004     10Gi       RWO,RWX                       24s
[root@master ~]# kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON    AGE
pv001     5Gi        RWO,RWX        Retain           Available                                            1m
pv002     5Gi        RWO            Retain           Available                                            1m
pv003     5Gi        RWO,RWX        Retain           Available                                            1m
pv004     10Gi       RWO,RWX        Retain           Bound       default/mypvc                            1m
pv005     15Gi       RWO,RWX        Retain           Available                                            1m      
[root@master ~]# kubectl get pods -o wide
NAME      READY     STATUS    RESTARTS   AGE       IP             NODE
vol-pvc   1/1       Running   0          59s       10.244.2.117   node2
[root@master ~]# curl 10.244.2.117
<h1>NFS stor 04</h1>      

如何将PVC綁定到特定的PV上?