在 Kubernetes(k8s)中,持久化存儲(Persistent Storage)是一個非常重要的概念,因為 Pod 本身是無狀態的,重啟后會丟失數據。為了支持有狀態應用,Kubernetes 提供了持久化存儲的機制,主要包括 PV(Persistent Volume,持久卷)和 PVC(Persistent Volume Claim,持久卷聲明)。
1. 什么是 PV 和 PVC?
PV(Persistent Volume,持久卷) Persistent Volume(PV)是由管理員創建的存儲資源,它代表了集群中的實際存儲,可以是本地存儲、NFS、云存儲(如 AWS EBS、Google Persistent Disk)等。PV 是集群級別的資源,不屬于特定的命名空間。
PVC(Persistent Volume Claim,持久卷聲明) Persistent Volume Claim(PVC)是用戶(開發者或應用)請求存儲資源的方式。PVC 代表了對存儲的需求,比如存儲大小、訪問模式等。Kubernetes 通過 PVC 綁定到合適的 PV,以滿足用戶的需求。
2. PV 和 PVC 的工作流程
-
管理員創建 PV:管理員在集群中定義一個 PV,并指定存儲類型、大小、訪問模式等。
-
用戶創建 PVC:應用程序需要存儲時,用戶創建 PVC,聲明所需的存儲資源。
-
Kubernetes 進行綁定:Kubernetes 根據 PVC 的請求尋找合適的 PV,并進行綁定。
-
Pod 掛載 PVC:Pod 使用 PVC 來掛載存儲,應用程序可以像使用本地存儲一樣訪問數據。
3. PV 的定義示例
apiVersion: v1
kind: PersistentVolume
metadata:name: example-pv
spec:capacity:storage: 10GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: standardhostPath:path: "/mnt/data"
字段解釋:
-
capacity:指定存儲容量,如 10Gi。 -
accessModes:訪問模式,包括:-
ReadWriteOnce(RWO):單個節點可讀寫。 -
ReadOnlyMany(ROX):多個節點只讀。 -
ReadWriteMany(RWX):多個節點可讀寫。
-
-
persistentVolumeReclaimPolicy:回收策略:-
Retain(保留):PV 釋放后數據仍然保留。 -
Recycle(回收):簡單刪除數據。 -
Delete(刪除):PV 釋放后刪除存儲。
-
-
storageClassName:存儲類,允許動態存儲。 -
hostPath:表示本地存儲路徑。
4. PVC 的定義示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: example-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5GistorageClassName: standard
字段解釋:
-
accessModes:指定訪問模式。 -
resources.requests.storage:請求的存儲大小。 -
storageClassName:必須與 PV 的存儲類匹配。
5. 在 Pod 中使用 PVC
apiVersion: v1
kind: Pod
metadata:name: example-pod
spec:containers:- name: app-containerimage: nginxvolumeMounts:- mountPath: "/usr/share/nginx/html"name: storagevolumes:- name: storagepersistentVolumeClaim:claimName: example-pvc
說明:
-
volumeMounts:將 PVC 掛載到容器內的/usr/share/nginx/html目錄。 -
volumes:引用example-pvc作為存儲。
6. PV 綁定 PVC 的過程
-
管理員創建 PV,它可以是靜態的或動態分配的。
-
用戶創建 PVC,請求特定存儲大小和訪問模式。
-
Kubernetes 綁定 PVC 到合適的 PV。
-
Pod 掛載 PVC,并可以訪問存儲數據。
7. 應用場景
-
數據庫存儲:MySQL、PostgreSQL、MongoDB 等數據庫需要持久化存儲,以防止數據丟失。
-
日志存儲:應用日志需要持久化存儲,以便分析和調試,即使 Pod 重新調度,日志仍然可用。
-
文件共享:多個 Pod 共享數據,如 NFS 或云存儲,多個應用可同時訪問相同數據。
-
機器學習:訓練數據集通常很大,需要持久化存儲,以供模型訓練和分析。
-
CI/CD 持久化:在持續集成/持續部署(CI/CD)流程中,構建緩存或構件存儲需要持久化數據。