天天看點

kubernetes 深入學習持久化存儲PV和PVC

kubernetes 深入學習持久化存儲PV和PVC

volume支援多種不同的内置驅動,使用volumes需要知道後端驅動的細節,使用起來不友善,是以社群提出了PV概念,即通過管理者定義好PV,通過PVC使用PV;随着PV數量的不斷增加,管理者需要頻繁定義PV,是以提出了動态存儲StorageClass,通過PVC中調用StorageClass動态建立PV,接下來介紹進階進階PV/PVC。

1. PV與PVC存儲

1.1 PV概念介紹

  • PV即PersistentVolume持久化存儲,是管理者定義的一塊存儲空間,能抽象化底層存儲細節,和node類似,PV是叢集級别的資源,生命周期獨立于Pod,支援靜态建立和動态建立,動态建立需通過StorageClass。
  • PVC即PersistentVolumeClaim持久化存儲申明,作為PV資源的使用方,可以指定請求存儲容量大小和通路模式
  • StorageClass,存儲類型支援建立PV,通過在PVC中指定StorageClass可動态建立PV,且支援指定不同的存儲 
kubernetes 深入學習持久化存儲PV和PVC

 PV支援設定字段介紹:

  • Capacity 存儲的特性,目前隻支援通過capacity指定存儲大小,未來會支援IOPS,吞吐量等名額
  • VolumeMode 存儲卷的類型,預設為filesystem,如果是塊裝置指定為block
  • Class 通過storageClassName指定靜态StorageClass的名稱
  • Reclaim Policy 回收政策,支援Retain保留,Recycle回收,DELETE删除
  • Volume驅動類型,和上一篇文章介紹的類似,支援不同的plugin驅動如RBD,NFS
  • Mount Options 挂載模式,支援管理者定義不同的挂載選項
  • AccessMode 通路模式,指定node的挂載方式,支援ReadWriteOnce讀寫挂載一次,ReadOnlyMany多個節點挂載隻讀模式,ReadWriteMany多個節點挂載讀寫模式,不同的volume驅動類型支援的模式有所不同,如下
kubernetes 深入學習持久化存儲PV和PVC

 1.2 定義PV存儲

接下來我們開始學習PV的使用,使用階段分為:1. 預先建立好PV,2. 使用者通過PVC調用PV,3. Pod中應用PVC,建立流程參考下圖:

kubernetes 深入學習持久化存儲PV和PVC

1. 定義一個PV,指定大小為10G,讀寫模式為單個node讀寫,回收模式為Retain,後端驅動plugin為NFS

[root@node-1 happylau]# cat pv-nfs-storage.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs-storage 
  labels:
    storage: nfs
  annotations:
    kubernetes.io.description: pv-storage
spec:
  storageClassName: nfs  #靜态指定存儲類StorageClass名稱
  capacity:              #capacity指定存儲容量大小
    storage: 10Gi        
  accessModes:           #通路模式為單個節點讀寫模式
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain  #回收模式為保留
  nfs:                  #後端plugin驅動類型為NFS,指定server和path路徑
    server: 10.254.100.101
    path: /mnt/data      

2. 建立PersistentVolumes

[root@node-1 happylau]# kubectl apply -f pv-nfs-storage.yaml 
persistentvolume/pv-nfs-storage unchanged      

3. 檢視PersistentVolumes清單

[root@node-1 happylau]# kubectl get persistentvolumes 
NAME             CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv-nfs-storage   10Gi       RWO            Retain           Available           nfs                     43m      

關于PV輸出解釋說明:

  1. ACCESS MODES 指定的是讀寫模式,RWO代表ReadWriteOnce,ROM代表ReadOnlyMany,RWX代表ReadWriteMany
  2. STATUS代表PV狀态,Available剛建立未綁定狀态,Bound為與PVC綁定,Released為PVC删除PV未釋放,Failed狀态異常。

4. 檢視PV詳細資訊,呈現的資訊會更詳細

[root@node-1 ~]# kubectl describe persistentvolumes pv-nfs-storage 
Name:            pv-nfs-storage
Labels:          storage=nfs
Annotations:     kubectl.kubernetes.io/last-applied-configuration:
                   {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{"kubernetes.io.description":"pv-storage"},"labels":{"storage":"nfs...
                 kubernetes.io.description: pv-storage
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    nfs
Status:          Available
Claim:           
Reclaim Policy:  Retain
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        10Gi
Node Affinity:   <none>
Message:         
Source:
    Type:      NFS (an NFS mount that lasts the lifetime of a pod)
    Server:    10.254.100.101
    Path:      /mnt/data
    ReadOnly:  false
Events:        <none>      

1.3. PVC引用PV

1. 通過定義PVC,通過selector和PV實作關聯,指定到相同的StorageClass

[root@node-1 happylau]# cat pvc-nfs-storage.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nfs-storage
  labels:
    storage: pvc
  annotations:
    kubernetes.io/description: "PersistentVolumeClaim for PV"
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  storageClassName: nfs
  resources:
    requests:
      storage: 1Gi
    limits:
      storage: 10Gi
  selector:
    matchLabels:
      storage: nfs      

2. 生成PersistentVolumeClaim

[root@node-1 happylau]# kubectl apply -f pvc-nfs-storage.yaml 
persistentvolumeclaim/pvc-nfs-storage created      

3. 檢視PersistentVolumeClaim清單,通過STATUS可以知道,目前PVC和PV已經Bond關聯

[root@node-1 happylau]# kubectl get persistentvolumeclaims 
NAME              STATUS   VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-nfs-storage   Bound    pv-nfs-storage   10Gi       RWO            nfs   

檢視PVC詳情:
[root@node-1 happylau]# kubectl describe persistentvolumeclaims pvc-nfs-storage 
Name:          pvc-nfs-storage
Namespace:     default
StorageClass:  nfs
Status:        Bound
Volume:        pv-nfs-storage
Labels:        storage=pvc
Annotations:   kubectl.kubernetes.io/last-applied-configuration:
                 {"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{"kubernetes.io/description":"PersistentVolumeClaim for PV"},"...
               kubernetes.io/description: PersistentVolumeClaim for PV
               pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      10Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Mounted By:    <none>
Events:        <none>              

4. 再次檢視PV的狀态,此時狀态為Bond,和default命名空間下的PVC pvc-nfs-storage關聯,此時PVC已經定義好

kubernetes 深入學習持久化存儲PV和PVC

                                                                          PV和PVC綁定狀态詳情 

[root@node-1 happylau]# cat pvc-nfs-deployments.yaml 
apiVersion: apps/v1 
kind: Deployment
metadata:  #deployment的中繼資料
  name: pvc-nfs-deployment
  labels:
    app: pvc-nfs-deployment
spec:      #deployment的屬性資訊
  replicas: 1  #副本控制數
  selector:
    matchLabels:
      app: pvc-nfs-deployment
  template:    #通過定義模闆引用Pod,template中的資訊和Pod定義的資訊一緻,包含metadata,spec資訊
    metadata:  #定義Pod的labels
      labels:
        app: pvc-nfs-deployment
    spec:
      containers:
      - name: nginx-web 
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - name: nginx-http-80
          protocol: TCP
          containerPort: 80
        volumeMounts:  #将PVC存儲挂載到目錄
        - name: pvc-nfs-storage
          mountPath: /usr/share/nginx/html 
      volumes:    #通過volumes引用persistentVolumeClaim存儲
      - name: pvc-nfs-storage
        persistentVolumeClaim:
          claimName: pvc-nfs-storage      

 2. 建立Deployments并檢視建立情況和Pod情況

建立Deployments
[root@node-1 happylau]# kubectl apply -f pvc-nfs-deployments.yaml 
deployment.apps/pvc-nfs-deployment created

檢視Deployments清單
[root@node-1 happylau]# kubectl get deployments
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
pvc-nfs-deployment   1/1     1            1           16s

檢視Deployments中的Pod
[root@node-1 happylau]# kubectl get pods -l app=pvc-nfs-deployment -o wide 
NAME                                  READY   STATUS    RESTARTS   AGE    IP            NODE     NOMINATED NODE   READINESS GATES
pvc-nfs-deployment-7467b9fbfc-xwdpr   1/1     Running   0          106s   10.244.1.29   node-2   <none>           <none>      
[root@node-1 happylau]# kubectl exec -it pvc-nfs-deployment-7467b9fbfc-xwdpr  /bin/bash
root@pvc-nfs-deployment-7467b9fbfc-xwdpr:/# df -h
Filesystem                Size  Used Avail Use% Mounted on
overlay                    50G  4.3G   43G  10% /
tmpfs                      64M     0   64M   0% /dev
tmpfs                     920M     0  920M   0% /sys/fs/cgroup
/dev/vda1                  50G  4.3G   43G  10% /etc/hosts
shm                        64M     0   64M   0% /dev/shm
10.254.100.101:/mnt/data   50G  9.9G   37G  22% /usr/share/nginx/html #挂載成功
tmpfs                     920M   12K  920M   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                     920M     0  920M   0% /proc/acpi
tmpfs                     920M     0  920M   0% /proc/scsi
tmpfs                     920M     0  920M   0% /sys/firmware

寫入站點資料内容
root@pvc-nfs-deployment-7467b9fbfc-xwdpr:~# echo "pvc index by happylau" >/usr/share/nginx/html/index.html 
root@pvc-nfs-deployment-7467b9fbfc-xwdpr:~# ls -l /usr/share/nginx/html/
total 4
-rw-r--r-- 1 nobody nogroup 22 Oct 12 02:00 index.html      
[root@node-1 ~]# kubectl get pods -l app=pvc-nfs-deployment -o wide 
NAME                                  READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
pvc-nfs-deployment-7467b9fbfc-xwdpr   1/1     Running   0          14m   10.244.1.29   node-2   <none>           <none>
[root@node-1 ~]# curl http://10.244.1.29
pvc index by happylau      

寫在最後

繼續閱讀