[k8s] Persistent Volumes ================= ###### tags: `kubernetes` `storage` > The **easiest** way to create the PV/PVC pair for your Pod is to use a StorageClass object, and then ***<span style="color: red">using the storageclass to create your PV-PVC pair dynamically</span>*** whenever you need to use it. # Persistent Volume + <span style="color:red; font-weight: 600">a cluster resource</span> + need to be there before using + created via yaml file + kind : PersistenVolume + spec: e.g. how much storage? + what types of storage do you need? + local storage、nfs server、cloud storage ### config + <kbd>accessModes</kbd> + `ReadWriteOnce` — the volume can be mounted as read-write by a single node + `ReadOnlyMany` — the volume can be mounted read-only by many nodes + `ReadWriteMany` — the volume can be mounted as read-write by many nodes + <kbd>persistentVolumeReclaimPolicy</kbd> + `Retain` + 當 PVC 刪除後(此時 PV 狀態為 Released),cluster administrator 可以進行手動的 reclaim + `Recycle` - 未來將會被廢棄,若有同樣的需求,建議改用 dynamic provisioning 來取代 (storage class) + `Delete` - 當這個 PVC 被刪除後,相對應的 PV & 實際的 storage 空間也都會一併被刪除。 + as default value + <kbd>storageClassName</kbd> + <span style="color: purple; font-weight: 600;">若 PV 設定了 class,那就只能讓帶有相同 class request 的 PVC 連結;反之亦然。</span> + <kbd>volumeMode</kbd> + <font color="red">???</font>: FileSystem、Block ### life cycle + `Available`: 可被 PVC 使用的狀態 + `Bound`: 已經連結到特定的 PVC + `Released`: PVC 已經被刪除,但 cluster 尚未進行 reclaim 的工作 + reclaim步驟 1. 刪除 PV (對應的實際資料並不會消失) 2. 清除實際資料 (optional, 如果有需求可做) 3. 若是使用已經存在的資料,那就再建立一個 PV,並指到原本的儲存空間 + `Failed`: reclaim 失敗後會進入的狀態 ## how to create PV #### YAML example: Local storage ```yaml= apiVersion: v1 kind: PersistentVolume metadata: name: example-pv spec: capacity: storage: 100Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Delete storageClassName: local-storage local: path: /mnt/disks/ssd1 nodeAffinity: required: nodeSelectorTerms: -matchExpressions: - key: kubernetes.io/hostname operator: In values: - example-node ``` #### YAML example: NFS storage ```yaml= apiVersion: v1 kind: PersistentVolume metadata: name: pv-name spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOne persistentVolumeReclaimPolicy: Recycle storeageClassName: slow mountOptions: - hard - nfsvers=4.0 nfs: path: /dir/path/on/nfs/server server: nfs-server-ip-address ``` #### YAML example: google cloud storage ```yaml= apiVersion: v1 kind: PersistentVolume metadata: name: test-volume labels: failure-domain.beta.kubernetes.io/zone: us-central1-a__us-central1-b spec: storage: 400Gi accessModes: - ReadWriteOnce gcePersistentDisk: pdName: my-data-disk fsType: ext4 ``` ## persisten volumes are not namespaced ![](https://i.imgur.com/ckHgWfb.png =450x) # Persistent Volume Claim ![](https://i.imgur.com/MOpW7VA.png =500x) ## How Application to access volume ![](https://i.imgur.com/p4VAGJo.png =400x) 1. Pod ***requests the volume*** through the PV claim 2. Claim tries to ***find a volume*** in cluster 3. Volume has the ***actual storage*** backend 4. Claims must be in the ***same namespace*** 5. Volume is mounted into the Pod 6. Volume is mounted into Container ![](https://i.imgur.com/v91Ru2U.png =400x) ```yaml= apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-name spec: storageClassName: manual volumeMode: Filesystem accessModes: - ReadWriteOnce resources: requests: storage: 10Gi ``` ```yaml= apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: myfronted image: nginx volumeMounts: - mountPath: "/var/www/html" name: mypd volumes: - name: mypd persistentVolumeClaim: claimName: pvc-name ```