Skip to content

Persistent Volumes

Persistent Volumes (PV) 是 Kubernetes 集群中的一塊儲存資源,由管理員事先設定或透過 StorageClass 動態供給。^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]

與 Pod 生命週期綁定的臨時性儲存(如 [[EmptyDir]])不同,Persistent Volume 擁有獨立於任何使用它的 Pod 的生命週期^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]。這意味著即使 Pod 被刪除或重啟,PV 中的數據依然會被保留,從而實現數據的持久化^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]。

核心概念

Persistent Volume 的核心概念在於將「儲存資源的供給」與「儲存資源的消費」分離。

  • 資源屬性:PV 是屬於集群層級的資源,而非屬於單一命名空間或 Pod^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]。
  • 生命週期獨立性:由於 PV 獨立於 Pod 存在,它解決了容器重啟或遷移時數據丟失的問題^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]。
  • 卷類型:Kubernetes 支援多種卷類型,PV 的實現底層可以是 NFS、iSCSI、雲端供應商提供的儲存服務(如 AWS EBS、GCE PD)等^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]。

PersistentVolumeClaim (PVC)

PersistentVolumeClaim (PVC) 表達的是使用者(或 Pod)對於儲存的請求^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]。

  • 資源請求:PVC 的邏輯類似於 Pod 對 Node 計算資源(CPU、記憶體)的請求。Pod 透過 PVC 來申請特定大小的儲存空間和特定的存取模式(如ReadWriteOnce)^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]。
  • 消耗限額:PVC 會請求並消耗 PV 的限額。Kubernetes 會透過控制邏輯將 PVC 綁定到符合條件的 PV 上^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]。

與其他儲存方式的區別

Kubernetes 提供了多種儲存解決方案,PV/PVC 通常用於需要長期保存數據的場景,與其他類型有顯著區別^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]:

  • EmptyDir:當 Pod 被刪除時,EmptyDir 中的數據也會被一併刪除,適合暫存或緩存。
  • HostPath:掛載 Node 節點上的檔案系統,存在安全風險,且僅限於該節點可用。
  • ConfigMap / Secrets:用於注入配置資料或敏感資料,主要目的是將配置資訊以檔案形式掛載進容器,而非作為主要資料儲存空間^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]。
  • NFS:網路檔案系統,雖然能實現 Pod 間共享,但 PV 提供了更抽象、標準化的管理方式,可包含 NFS 作為其後端。

使用流程

在 Pod 中使用持久化儲存通常遵循以下步驟^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]:

  1. 定義 PV:管理員建立 PV,指定儲存大小、存取模式和後端儲存類型。
  2. 建立 PVC:使用者建立 PVC,聲明所需的儲存資源。
  3. 綁定:Kubernetes 將 PVC 綁定到條件符合的 PV。
  4. 掛載:在 Pod 定義中,透過 .spec.volumes 引用 PVC,並在 .spec.containers[*].volumeMounts 中聲明容器內的掛載路徑^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]。

相關概念

Sources

^[400-devops__06-Kubernetes__k8s-ithelp__Day16__README.md]