Kubernetes Volume 是包含資料的目錄,可供 Kubernetes Pod 中的容器存取。目錄的位置、支援目錄的儲存介質及其內容取決於所使用的特定 Volume 類型。
在 Pod 中容器內執行的行程會看到由以下內容組成的檔案系統檢視:
磁碟區在 Pod 範本的 .spec.containers[*].volumeMounts 欄位中定義。對於每個 Pod 和 Pod 中的每個容器映像,您需要指定它將掛載哪些磁碟區以及哪些路徑(每個容器的路徑可能不同)。
Kubernetes 中有幾種類型的 Volume。其中最重要的是短暫卷,它們儲存在本地的 Kubernetes 節點上,會在 Pod 重新啟動時刪除,以及Kubernetes 持久卷 (PV),即使在 Pod 關閉後也會保留資料。
在本文中:
Kubernetes 支援各種 Volume,允許每個 Pod 同時使用多種 Volume 類型。臨時 Volume 綁定到 Pod 的存留期,而持久 Volume 可以在 Pod 的存留期之後持續存在。這意味著,一旦 Pod 不再存在,Kubernetes 就會銷毀臨時 Volume,同時保留持久 Volume 的資料。
Kubernetes 提供 PersistentVolume 子系統與 API,用於抽象化儲存資源配置和使用。它適用於兩個 API 資源:PersistentVolume(PV)和 PersistentVolumeClaim(PVC)。
PersistentVolume (PV)
PV 是位於叢集中的儲存資源。管理員可以手動佈建 PV,Kubernetes 可以使用儲存類別來動態佈建 PV。與磁碟區一樣,PV 是外掛程式,但其生命週期與使用 PV 的任何 Pod 無關。
PV 用作 API 物件,用於擷取儲存實作的詳細資訊,包括 iSCSI、NFS 和雲端供應商儲存系統。它的工作方式類似於節點,但提供儲存資源而不是運算資源。
PersistentVolumeClaim (PVC)
PVC 是使用者發出的儲存請求。它的工作方式與 Pod 類似,但使用的是 PV 資源,而不是節點資源。PVC 可以請求特定的儲存資源,指定大小存取模式,例如 ReadWriteOnce、ReadWriteMany 和 ReadOnlyMany。
PVC 使用戶能夠使用抽象的儲存資源,但使用者通常需要具有不同屬性的 PV 來處理不同的問題。這就是為什麼叢集管理員經常需要提供不同的 PV,這些 PV 在大小和存取模式方面有所不同。他們可以做到這一點,而無需透過 StorageClass 資源向使用者公開實作細節。
相關內容:閱讀我們的Kubernetes PVC指南
臨時卷不會在重新啟動後永久存儲數據。這些卷綁定到 pod 的生命週期,這意味著它們會與 pod 一起創建和刪除。它支援停止和重新啟動 pod,而不會將它們限制為持久卷的可用性。
臨時卷易於部署和管理。您可以在 pod 規範中以內聯方式指定它們。臨時卷非常適合不需要持續儲存的應用程式,例如快取服務。
當 Kubernetes 將 Pod 分配給節點時,就會創建一個 emptyDir 卷。此卷的生命週期與該特定節點上存在的 Pod 生命週期息息相關。當容器重新啟動或崩潰時,emptyDir 卷會重新創建。但是,當 Pod 從節點中移除、崩潰或死亡時,此卷中的數據將被刪除並丟失。
建立 emptyDir 磁碟區後,您可以在 pod 資訊清單檔案中將磁碟區類型名稱宣告為欄位。它會顯示在 volume 屬性區段下,並以空大括號{}作為值。EmptyDir 磁碟區主要適用於暫存資料儲存。例如,您可以將其用於暫存空間,例如以磁碟為基礎的合併。
您可以將 emptyDir Volume 儲存在支援節點的介質上。例如,您可以使用網路儲存或 SSD。或者,您可以在 emptyDir.medium 欄位中設置「memory」,Kubernetes 將掛載一個由 RAM 支援的檔案系統(tmpfs)。請注意,Kubernetes 會在節點重新開機時清除 tmpfs。
hostPath 磁碟區會將主機節點檔案系統中的目錄或檔案掛載到 Pod 中。
以下是 hostPath Volume 的主要使用案例:
HostPath 磁碟區安全性
HostPath 磁碟區會帶來許多安全風險。請盡可能避免使用這些磁碟區。如果必須使用 HostPath 磁碟區,則應僅將其範圍限定為所需的目錄或檔案,並將其掛載為 ReadOnly。
以下是主要的安全風險:
您可以使用 AdmissionPolicy 來限制 HostPath 對某些目錄的存取。但是,僅當您需要 volumeMounts 使用 readOnly 掛載時,該原則才有效。
ConfigMap 允許將配置數據注入 Pod。儲存在 ConfigMap 中的數據可以在 configMap 卷類型中引用,然後由在 Pod 中執行的容器化應用程式使用。參考 ConfigMap 時,需要在卷中提供 ConfigMap 的名稱。Kubernetes 允許您自訂 ConfigMap 中特定條目的路徑。
Kubernetes 提供了多個儲存外掛程式,用於存取部署在 Kubernetes 叢集中的儲存裝置。這些是使用 StorageClass 物件實現的。
Kubernetes 目前支援的一些主要外掛程式包括 GCEPersistentDisk、AWSElasticBlockStore、AzureDisk、Glusterfs、NFS 和 iSCSI。有關這些外掛程式的更多詳細資訊,請參閱 StorageClass 文件。
讓我們更詳細地回顧兩個值得注意的儲存外掛程式。
Network File System (NFS) 是用於將儲存設備掛載為本機磁碟機的標準通訊協定。Kubernetes 允許您將 NFS 磁碟區掛載為容器中的本機磁碟機。由於舊版程式碼經常透過 NFS 存取資料,因此此外掛程式對於將舊版工作負載移轉至 Kubernetes 非常有用。
透過 NFS 和 Kubernetes 存取資料有兩種方式:
容器儲存介面(CSI)是一個標準介面,允許容器協調器將儲存系統公開給他們管理的容器。CSI 允許儲存廠商建立「樹外」外掛程式,這意味著它們不需要簽入 Kubernetes 程式碼儲存庫,也不隨 Kubernetes 一起提供。
有許多基於 CSI 的樹外外掛程式由儲存供應商直接提供。CSI 的出現使儲存技術支援 Kubernetes 變得更加容易。
相關內容:閱讀我們的 Container Storage Interface 指南
建立磁碟區並使 Pod 能夠存取磁碟區涉及兩個步驟:
這些步驟是相輔相成的。建立磁碟區時,還必須將其掛載到容器,而且如果不在 Pod 範本中宣告磁碟區,則無法掛載磁碟區。
以下範例顯示了在 pod 範本 YAML 設定中建立和掛載磁碟區:
spec: containers: —name: my-app image: nginx volumeMounts: —name: my-volume mountPath: /app/config volumes: —name: my-volume
在此程式碼中:
若要建立 Kubernetes Volume,您需要部署一個或多個宣告該 Volume 的 Pod。執行此操作的常見方法是透過 Deployment 物件。以下是執行下列操作的 Deployment 資訊清單範例:
apiVersion: apps/v1 kind: Deployment metadata: name: pods-with-volumes spec: replicas: 3 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: containers: —name: my-container image: nginx:1.14.2 volumeMounts: —mountPath: / name: my-volume volumes: —name: my-volume emptyDir: {}
請注意,此 Deployment 的名稱定義在 pods-with-volumes 中,這是您在 Kubernetes 環境中引用它的方式。
正如我們在上一節中看到的,此 Deployment 物件執行建立磁碟區所需的兩個動作:
假設此 YAML 檔案以名稱 my-deployment.yaml 儲存。您可以使用此命令在 Kubernetes 叢集中建立 Deployment:
kubectl apply -f my-deployment.yaml
若要驗證 Deployment 是否使用預期的磁碟區正確執行,請執行此命令:
kubectl describe pods pods-with-volumes
如果一切運作正常,輸出將顯示每個 pod 都有一個名為 my-container 的容器,並具有所要求的掛載點:
掛載: / 從 my-volume (rw)
輸出還將顯示在每個 Pod 下執行的磁碟區:
Volumes: my-volume: Type: EmptyDir(共用 Pod 生命週期的臨時目錄)
NetApp Cloud Volumes ONTAP 是領先業界的企業級儲存管理解決方案,可在 AWS、Azure 和 Google Cloud 上提供安全可靠、實證肯定的儲存管理服務。Cloud Volumes ONTAP 容量可以擴充至 PB 級,並支援各種使用案例,例如檔案服務、資料庫、DevOps 或任何其他企業工作負載,並具有一系列強大的功能,包括高可用度、資料保護、儲存效率、Kubernetes 整合等。
特別值得一提的是,Cloud Volumes ONTAP 可支援容器化工作負載的 Kubernetes Persistent Volume 資源配置和管理 需求。
透過這些 Kubernetes 工作負載與 Cloud Volumes ONTAP 案例研究,詳細瞭解 Cloud Volumes ONTAP 如何幫助解決容器化應用程式的挑戰。