kubernetes-PVC|PV-8

pvc|pv

正常創建pv時的邏輯,需要定義如下,用戶\開發使用pvc,集羣管理員創建pv,存儲人員負責維護存儲

在這裏插入圖片描述
​ 在pod中直接定義一個存儲卷, 定義的時候只需要說明用多大的存儲卷, 這個存儲卷叫PVC類型的存儲卷, 而該這個PVC類型的存儲卷必須與當前名稱空間中PVC建立直接綁定關係,而PVC又必須與PV建立綁定關係,PV應該是某個真正存儲設備上的存儲空間;

​ PVC與PC只是k8s之上的一種抽象資源,這兩種資源與創建ingress或server並沒有本質區別,底層存儲給它切成塊,然後在將塊做成PV,pod直接指定volume並且PVC與PV建立綁定關係, PVC與PV建立綁定關係取決於在創建POD定義使用多大的存儲空間時決定;
在這裏插入圖片描述

pvc

PersistentVolumeClaim(PVC)是用戶存儲的請求。它與 Pod 相似。Pod 消耗節點資源,PVC 消耗 PV 資源。Pod 可以請求特定級別的資源(CPU 和內存)。聲明可以請求特定的大小和訪問模式(例如,可以以讀/寫一次或 只讀多次模式掛載)。

~]# kubectl explain pvc          # 系統自帶的pvc資源
    KIND:     PersistentVolumeClaim 
    VERSION:  v1

~]# kubectl explain pvc.spec
    accessModes: 訪問模型,是否支持多人訪問
    resources:  資源限制, 最少需要多少資源
    selector:  必須選擇哪個pv建立關係
    storageClassName: 存儲類名稱
    volumeMode: 存儲卷模式
    volumeName:  精確選擇某一個pv資源,默認就是隨機
    
# PVC與PV是一一對應的, 但多個POD可以綁定一個PVC, 這個需要accessModes進行控制,綁定不了PVC就會padding

pvc狀態

狀態 說明
Available 資源尚未被claim使用
Bound 卷已經被綁定到claim了
Released claim被刪除,卷處於釋放狀態,但未被集羣回收
Failed 卷自動回收失敗

pv

PersistentVolume(PV)是由管理員設置的存儲,它是羣集的一部分。就像節點是集羣中的資源一樣,PV 也是集羣中的資源。 PV 是 Volume 之類的卷插件,但具有獨立於使用 PV 的 Pod 的生命週期。此 API 對象包含存儲實現的細節,即 NFS、iSCSI 或特定於雲供應商的存儲系統。

~]# kubectl explain pv          # 建立與存儲之間的關連
    KIND:     PersistentVolume
    VERSION:  v1

accessModes: 可以定義成多種權限, 三種權限都能被定義
    ReadWriteOnce – 存儲卷只能被一個節點讀寫    RWO 
    ReadOnlyMany  – 存儲卷可以同時被多個節點只讀 ROX
    ReadWriteMany – 存儲卷可以同時被多個節點讀寫 RWX

RECLAIM POLICY: 回收策略
 	Retain:   當刪除PVC之後還保留PV

pv狀態

binding:綁定狀態,也就是說該pv已經綁定到了一個名稱空間;

availble:可用狀態,也就是說該pv可以供名稱空間申請綁定;

reclaim:回收狀態,表示pvc已刪除,處於回收狀態,回收有三種邏輯;
    recycle:刪除pvc之後,清空對應pv裏面的數據;
    delete(廢棄):刪除pvc同時刪除pv;
    retain:刪除pvc,pv和數據都保留;

PV生命週期

PV對於底層存儲提供多種解決方案

  1. 靜態提供,由管理員手動創建
  2. 動態提供,後端存儲系統需要有很多的邏輯存儲單元,但它並沒有手動定義成PV,只有當用戶有需要時在某個名稱空間中創建PVC時,纔會根據用戶請求的需求來動態創建PV,比如說創建PVC時指定存儲大小爲1Gi,那麼這時就會根據用戶的需求找出底層存儲空間中最合適的一個存儲邏輯單元,將其動態創建成PV,並且讓PV與PVC二者綁定,這就叫動態供給,而這種動態供給要求存儲系統要實現存在多個邏輯存儲單元,這種多個存儲單元在必要時能滿足PVC的請求,自動創建PV;
  3. 自動創建,後端存儲只提供存儲空間,也沒有劃分邏輯存儲單元(類似於磁盤沒有格式化),當用戶創建PVC的時,根據用戶的請求,動態的調用存儲系統的管理接口,創建一個正好滿足PVC需求的邏輯存儲單元, 在將這個邏輯存儲單元創建成爲k8s集羣上的PV,然後再與PVC綁定,但這個有一個基本的前提條件就是對應的存儲系統需要支持restfull接口的API,比如ceph,不支持的如NFS

所以我們整個PV的生命週期,一、先提供PV,二、綁定PVC,三、綁定之後使用,四、用完就可以回收了;

存儲類

​ 爲什麼pvc在創建時能動態觸發供給pv,這個功能主要依賴於一個存儲類(storageClass),也就是說,我們需要事先在k8s之上將外部的存儲系統,比如ceph,在k8s之上先定義一種其它類型的存儲資源(存儲類[storageClass]);
​ 當創建一個PVC時,PVC不是向存儲系統請求,而是向storageClass請求,而storageClass已經配置瞭如何連接這個外部存儲系統的管理API接口,其內部配置了各種各樣的連接參數,並且也知道如何連接底層的存儲系統管理接口,在必要時會調用管理接口去創建一個邏輯存儲單元,並且會自動在當前storageClass中創建一個PV,所以PV是屬於storageClass的;
​ 當PVC去請求PV時,如果通過storageClass來實現,那麼該PVC也屬於storageClass, 需要注意的是,PVC只能向同一個storageClass中的PV請求綁定,假設PVC屬於storageClass1,那它一定向storageClass1的PV請求綁定,不能跨存儲類,如果PVC不屬於任何一個storageClass,那麼PV也不屬於任何的storageClass;

​ Kubernetes集羣管理員通過提供不同的存儲類,可以滿足用戶不同的服務質量級別、備份策略和任意策略要求的存儲需求。動態存儲卷供應使用storageClass進行實現,其允許存儲卷按需被創建。如果沒有動態存儲供應,Kubernetes集羣的管理員將不得不通過手工的方式類創建新的存儲卷。通過動態存儲卷,Kubernetes將能夠按照用戶的需要,自動創建其需要的存儲, k8s存儲類
在這裏插入圖片描述

類別 類型 說明
Bonze Storage Class 圖排存儲 又慢又笨,
Sliver Storage Class 條形存儲 速度一般,
Gold Storage Class 金牌存儲 性能可觀,ssd

創建-示例-NFS

說明: pv綁定存儲, pvc綁定pv(自動尋找大小匹配或者選擇器選定的), pod綁定pvc, 動態提供
pod–>pvc–>pv–>存儲

# 定義pvc存儲卷
~]# kubectl explain pod.spec.volumes.persistentVolumeClaim
    claimName	<string> -required   # pvc卷組名稱
    readOnly	<boolean>   # 是否只讀

掛載目錄

以NFS,動態提供爲例, 實際 client --> storageClass --> 【PVC --> PV】 同一個存儲類

[root@slave1 nfs]# cat /etc/exports
/data/nfs/v1 192.168.2.0/24(rw)
/data/nfs/v2 192.168.2.0/24(rw)
/data/nfs/v3 192.168.2.0/24(rw)

[root@slave1 nfs]# exportfs -arv     
exporting 192.168.2.0/24:/data/nfs/v3
exporting 192.168.2.0/24:/data/nfs/v2
exporting 192.168.2.0/24:/data/nfs/v1

Export list for slave1:
/data/nfs/v3 192.168.2.0/24
/data/nfs/v2 192.168.2.0/24
/data/nfs/v1 192.168.2.0/24

創建pv

1024 = 1Ki but 1000 = 1k

]# cat pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv-1
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  nfs:
    path: /data/nfs/v1
    server: 192.168.2.221
---
。。。。

]# kubectl get pv   # 定義三個
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM
my-pv-1   5Gi        RWO,ROX,RWX    Retain           Available        
my-pv-1   5Gi        RWO,ROX,RWX    Retain           Available        

]# kubectl describe pv my-pv-1
Name:            my-pv-1
Labels:          <none>
Annotations:     pv.kubernetes.io/bound-by-controller: yes
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    
Status:          Bound
Claim:           default/my-pvc-1
Reclaim Policy:  Retain
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        5Gi
Node Affinity:   <none>
Message:         
Source:
    Type:      NFS (an NFS mount that lasts the lifetime of a pod)
    Server:    192.168.2.221
    Path:      /data/nfs/v1
    ReadOnly:  false

創建pvc

]# cat pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc-1
spec:
  accessModes: 
  - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi
  volumeMode: Filesystem
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc-2
spec:
  accessModes: 
  - ReadWriteOnce
  resources:
    requests:
      storage: 4Gi
  volumeMode: Filesystem
      
]# kubectl get pv
NAME      CAPACITY   ACCESS  RECLAIM POLICY   STATUS   CLAIM              AGE
my-pv-1   5Gi        RWO     Retain           Bound    default/my-pvc-1   3d4h
my-pv-2   5Gi        RWO     Retain           Bound    default/my-pvc-2   3d4h

]# kubectl get pvc
NAME       STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc-1   Bound    my-pv-1   5Gi        RWO                           3d4h
my-pvc-2   Bound    my-pv-2   5Gi        RWO                           3d4h

]# kubectl describe pvc my-pvc-2
Name:          my-pvc-2
Namespace:     default
StorageClass:  
Status:        Bound
Volume:        my-pv-2
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      5Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Mounted By:    <none>
Events:        <none>

創建pod

# cat nfs_bound_pv.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs2nfs
spec:
  selector:
    matchLabels:
      name: my-bound
      release: qa
  replicas: 2
  strategy: 
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      name: my-temp
      labels:
        name: my-bound
        release: qa
    spec:
      containers:
      - name: my-bounds
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
      volumes:
      - name: my-bounds
        persistentVolumeClaim:
          claimName: "my-pvc-1"
  
]# kubectl describe pvc my-pvc-1
Name:          my-pvc-1
Namespace:     default
StorageClass:  
Status:        Bound
Volume:        my-pv-1
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      5Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Mounted By:    nfs2nfs-7fccfd4dbb-9jjxb
               nfs2nfs-7fccfd4dbb-szhwv
Events:        <none>

yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      5Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Mounted By:    nfs2nfs-7fccfd4dbb-9jjxb
               nfs2nfs-7fccfd4dbb-szhwv
Events:        <none>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章