K8S的存儲之pv和pvc
在 Kubernetes (k8s) 中,持久化存儲是通過 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 來實現的。PVC 是用戶對存儲資源的請求,而 PV 是集群中的實際存儲資源。PVC 和 PV 的關系類似于 Pod 和 Node 的關系。
PersistentVolume (PV)
PV 是集群中的一塊存儲資源,可以由管理員預先配置,或者通過 StorageClass 動態創建。PV 是集群級別的資源,獨立于 Pod 的生命周期。
PersistentVolumeClaim (PVC)
PVC 是用戶對存儲資源的請求。用戶通過 PVC 來申請特定大小和訪問模式的存儲資源。PVC 會綁定到一個合適的 PV 上,從而為 Pod 提供持久化存儲。
PVC 的使用流程
- 創建 PV:管理員預先創建 PV,或者通過 StorageClass 動態創建 PV。
- 創建 PVC:用戶創建 PVC,指定所需的存儲大小和訪問模式。
- 綁定 PV 和 PVC:Kubernetes 會根據 PVC 的要求,自動綁定一個合適的 PV。
- Pod 使用 PVC:在 Pod 的配置中引用 PVC,Pod 就可以使用該 PVC 所綁定的 PV 進行持久化存儲。
PVC 的 YAML 示例
以下是一個 PVC 的 YAML 示例:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: standard
- accessModes:指定存儲的訪問模式,常見的有
ReadWriteOnce
(單個節點讀寫)、ReadOnlyMany
(多個節點只讀)、ReadWriteMany
(多個節點讀寫)。 - resources.requests.storage:指定所需的存儲大小。
- storageClassName:指定使用的 StorageClass 名稱。如果省略,則使用默認的 StorageClass。
Pod 使用 PVC 的 YAML 示例
以下是一個 Pod 使用 PVC 的 YAML 示例:
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: nginxvolumeMounts:- mountPath: "/usr/share/nginx/html"name: my-storagevolumes:- name: my-storagepersistentVolumeClaim:claimName: my-pvc
- volumeMounts:指定容器內掛載的路徑。
- volumes:指定使用的 PVC。
動態 Provisioning
Kubernetes 支持動態創建 PV,這是通過 StorageClass 來實現的。StorageClass 定義了存儲的類型和參數,當用戶創建 PVC 時,Kubernetes 會根據 StorageClass 自動創建 PV。
以下是一個 StorageClass 的 YAML 示例:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: standard
provisioner: kubernetes.io/aws-ebs
parameters:type: gp2
- provisioner:指定用于創建 PV 的插件。
- parameters:指定存儲的具體參數。
總結
- PVC 是用戶對存儲資源的請求。
- PV 是集群中的實際存儲資源。
- PVC 和 PV 的綁定可以是靜態的(預先創建 PV)或動態的(通過 StorageClass 動態創建 PV)。
PV-PVC-POD測試(使用nfs):
vi pv-pvc-pod.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: v1
spec:capacity:storage: 10Mi #pv的存儲空間容量accessModes: ["ReadWriteOnce"]nfs:path: /data/volumes/v1 #把nfs的存儲空間創建成pvserver: 172.16.80.131 #nfs服務器的地址
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 10Mi
---
apiVersion: v1
kind: Pod
metadata:name: pod-pvc
spec:containers:- name: nginximage: 172.16.80.140/nginx/nginx:1.26volumeMounts:- name: nginx-htmlmountPath: /usr/share/nginx/htmlvolumes:- name: nginx-htmlpersistentVolumeClaim:claimName: my-pvc
mkdir /data/volume/v1
echo 'pvc test' > /data/volume/v1/index.html
kubectl get pv
kubectl get pvc
kubectl get pods -owide
curl 10.244.196.129