在 Kubernetes(K8s)中,卷(Volume)?是用于解決容器內數據持久化、容器間數據共享以及與外部存儲交互的核心機制。它本質上是一個可供 Pod 中容器訪問的存儲目錄,生命周期獨立于容器(容器重啟或銷毀后,卷中的數據可保留)。
一、卷的核心作用
- 數據持久化:容器本身是臨時的(銷毀后數據丟失),卷可將數據存儲在容器外部(如本地磁盤、網絡存儲),確保數據不隨容器消失。
- 容器間共享:同一 Pod 內的多個容器可通過掛載同一個卷實現數據共享(如前端容器生成的文件供后端容器處理)。
- 對接外部存儲:卷支持多種存儲類型(本地磁盤、NFS、云存儲等),讓 Pod 能便捷使用集群外的存儲資源。
二、卷的類型與常見實例
K8s 支持多種卷類型,適用于不同場景,以下是常用類型及實例:
1. 臨時卷(Ephemeral Volumes)
特點:生命周期與 Pod 一致(Pod 銷毀后卷也刪除),但數據不依賴單個容器,適合臨時緩存、日志等。
常見類型:
emptyDir
:Pod 創建時自動生成的空目錄,所有容器可讀寫,Pod 銷毀后數據刪除。
實例:同一 Pod 內的兩個容器共享數據
yaml
apiVersion: v1 kind: Pod metadata:name: shared-pod spec:containers:- name: container-1image: busyboxcommand: ["sh", "-c", "echo 'hello from container1' > /shared/data.txt; sleep 3600"]volumeMounts: # 掛載卷到容器內目錄- name: shared-volumemountPath: /shared- name: container-2image: busyboxcommand: ["sh", "-c", "cat /shared/data.txt; sleep 3600"]volumeMounts: # 掛載同一個卷- name: shared-volumemountPath: /sharedvolumes: # 定義卷- name: shared-volumeemptyDir: {} # 使用 emptyDir 類型
2. 持久卷(Persistent Volumes)
- 特點:生命周期獨立于 Pod(集群級資源),數據長期保留,需配合?PVC(PersistentVolumeClaim)?使用(詳見前文 PV/PVC 概念)。
- 實例:通過 PVC 掛載持久卷
yaml
apiVersion: v1 kind: Pod metadata:name: pvc-pod spec:containers:- name: appimage: nginxvolumeMounts:- name: pv-storagemountPath: /usr/share/nginx/htmlvolumes:- name: pv-storagepersistentVolumeClaim:claimName: my-pvc # 關聯已創建的 PVC
3. 本地卷(Local Volumes)
- 特點:使用節點(Node)本地磁盤作為存儲,性能高但數據僅存于單個節點(節點故障可能丟失數據),適合對性能要求高的場景(如數據庫臨時緩存)。
- 實例:掛載節點的?
/data/local
?目錄yaml
apiVersion: v1 kind: Pod metadata:name: local-volume-pod spec:containers:- name: appimage: busyboxcommand: ["sleep", "3600"]volumeMounts:- name: local-storagemountPath: /mnt/localvolumes:- name: local-storagehostPath:path: /data/local # 節點上的實際目錄type: DirectoryOrCreate # 若目錄不存在則創建
4. 網絡卷(Network Volumes)
- 特點:數據存儲在網絡中的遠程服務器,可跨節點訪問,適合多 Pod 共享數據(如 NFS、Ceph、云存儲等)。
- 實例:掛載 NFS 網絡存儲
yaml
apiVersion: v1 kind: Pod metadata:name: nfs-pod spec:containers:- name: appimage: busyboxcommand: ["sleep", "3600"]volumeMounts:- name: nfs-storagemountPath: /mnt/nfsvolumes:- name: nfs-storagenfs:server: 172.25.254.254 # NFS 服務器 IPpath: /nfs/shared # NFS 共享目錄
三、卷的使用流程
- 定義卷:在 Pod 的?
volumes
?字段中聲明卷的名稱和類型(如?emptyDir
、hostPath
、persistentVolumeClaim
?等)。 - 掛載卷:在容器的?
volumeMounts
?字段中,將卷掛載到容器內的指定路徑(mountPath
)。 - 使用數據:容器通過掛載路徑讀寫卷中的數據,實現數據共享或持久化。
四、核心總結
- 本質:卷是 Pod 內的存儲目錄,生命周期獨立于容器,解決數據持久化和共享問題。
- 類型:根據場景選擇(臨時存儲用?
emptyDir
,持久化用 PV/PVC,本地高性能用?hostPath
,跨節點共享用 NFS 等網絡卷)。 - 關鍵:卷是 Pod 級資源,同一 Pod 內的容器可共享卷;跨 Pod 共享需依賴網絡存儲或 PV/PVC。
通過卷,K8s 實現了容器與存儲的解耦,讓應用數據管理更靈活、可靠。