--- lang: zh-tw title: Kubernetes Storage tags: K8s --- # Storage + Volume + Persistent Volume ## Volume + 防止容器重啟時資料丟失 + 在同一個Pod可以共用Volume的資料 + Pod不再存在時,Volume也會消失 ## Persistent Volume + Persistent Volume(持久卷),是Cluster中的一塊資源,簡稱PV + PV只能是網路儲存,不屬於任何Node,但可以在每個Node上存取 + PV是獨立於Pod之外,與Volume掛載在Pod上不同 ## Persistent Volume Claim + 簡稱PVC,負責批配符合條件的PV,並與該PV進行綁定 | accessModes | | | ------------- | ---------------------------------- | | ReadWriteOnce | 只能掛載在同一個Node上提供讀寫功能 | | ReadOnlyMany | 能在多個Node上提供讀取功能 | | ReadWriteMany | 能在多個Node上提供讀寫功能 | ## PVC Reclaiming 當使用者不需要volume時,就可將PVC從Cluster刪除,此時與之連結的PV會被釋放,並且可以提供其它PVC進行reclaim ## PV的Reclaim Policy 用來告訴Cluster當PV被釋放後,如何處理已存在的資料 | Reclaim<br />Policy | | | ------------------- | -------------------------------------------------- | | Retained | PVC刪除後,可以進行手動reclaim | | Deleted | PVC刪除後,對應的PV與實際的storage空間會一併被刪除 | + Recycled已被廢棄,建議使用Dynamic Provisioning + 手動reclaim: + 刪除PV(對應的實際資料不會消失) + 清除實際資料(optinal) + 若是使用已存在的資料,就再建立一個PV,並指到原本的Storage + 完成後就會有一個帶有原本資料且可以使用的PV了 ## PV and PVC | | | | ------- | ---- | | PV | 由Storage管理員建立 | | PVC | 來自使用者的Request,會消耗PV資源<br />PVC指定特定的size或accessModes的PV | ## Persistent Volume Provisioning + 產生PV的方法有`Static`與`Dynamic` | | | | ------- | ---- | | Static | 預先建立幾個PV,使用者在新增PVC時,可以相互match並開始使用storage | | Dynamic | 當Cluster中現存的PV沒有符合使用者的PVC需求時,會嘗試建立符合需求條件的PV,這樣自動化的行為必須用StorageClass達成 | ## PVC如何與PV綁定 1. 透過`storageClassName`,找到相同PV 2. 透過`Label`標籤,找到相同PV ## StorageClass ```yaml= ## storageclass.yaml apiVersion: storage.k8s.io/v1 ## API 版本 kind: StorageClass ## 元件種類 metadata: name: ssd ## storage class 名稱 provisioner: kubernetes.io/gce-pd ## 指定 Volumn 類型 parameters: ## PV 符合條件 type: pd-ssd reclaimPolicy: Retain ## 回收機制 ``` ## PV Template ```yaml= ## pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: local-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: ssd hostPath: path: /tmp ``` ## PVC Template ```yaml= apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-master-storage spec: storageClassName: ssd accessModes: - ReadWriteOnce resources: requests: storage: 5Gi ```