選單

本頁面使用了機器翻譯。某些內容可能不盡完善。請告訴我們如何改進。

分享意見

5 種類型的 Kubernetes 磁碟區以及如何使用它們

目錄

分享本頁

Yifat Perry
Yifat Perry

什麼是 Kubernetes Volume?

Kubernetes Volume 是包含資料的目錄,可供 Kubernetes Pod 中的容器存取。目錄的位置、支援目錄的儲存介質及其內容取決於所使用的特定 Volume 類型。

在 Pod 中容器內執行的行程會看到由以下內容組成的檔案系統檢視:

  • 與容器映像內容相符的根檔案系統。
  • 掛載到容器上的磁碟區(如果已定義)。每個磁碟區掛載到容器檔案系統內的特定路徑上。

磁碟區在 Pod 範本的 .spec.containers[*].volumeMounts 欄位中定義。對於每個 Pod 和 Pod 中的每個容器映像,您需要指定它將掛載哪些磁碟區以及哪些路徑(每個容器的路徑可能不同)。

Kubernetes 中有幾種類型的 Volume。其中最重要的是短暫卷,它們儲存在本地的 Kubernetes 節點上,會在 Pod 重新啟動時刪除,以及Kubernetes 持久卷 (PV),即使在 Pod 關閉後也會保留資料。

在本文中:

  • Kubernetes Volume 的類型
    • 持續 Volume
    • 暫存磁碟區
    • EmptyDir 磁碟區
    • Kubernetes hostPath 磁碟區
    • Kubernetes 磁碟區 ConfigMap
  • 用於儲存 Kubernetes Volume 的外掛程式
    • NFS
    • CSI
  • 什麼是 Kubernetes volumeMounts?
  • 透過部署 Pod 建立 Kubernetes Volume
  • 使用 NetApp Cloud Volumes ONTAP 進行 Kubernetes Volume 管理

5 種類型的 Kubernetes Volume

Kubernetes 支援各種 Volume,允許每個 Pod 同時使用多種 Volume 類型。臨時 Volume 綁定到 Pod 的存留期,而持久 Volume 可以在 Pod 的存留期之後持續存在。這意味著,一旦 Pod 不再存在,Kubernetes 就會銷毀臨時 Volume,同時保留持久 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 規範中以內聯方式指定它們。臨時卷非常適合不需要持續儲存的應用程式,例如快取服務。

EmptyDir 磁碟區

當 Kubernetes 將 Pod 分配給節點時,就會創建一個 emptyDir 卷。此卷的生命週期與該特定節點上存在的 Pod 生命週期息息相關。當容器重新啟動或崩潰時,emptyDir 卷會重新創建。但是,當 Pod 從節點中移除、崩潰或死亡時,此卷中的數據將被刪除並丟失。

建立 emptyDir 磁碟區後,您可以在 pod 資訊清單檔案中將磁碟區類型名稱宣告為欄位。它會顯示在 volume 屬性區段下,並以空大括號{}作為值。EmptyDir 磁碟區主要適用於暫存資料儲存。例如,您可以將其用於暫存空間,例如以磁碟為基礎的合併。

您可以將 emptyDir Volume 儲存在支援節點的介質上。例如,您可以使用網路儲存或 SSD。或者,您可以在 emptyDir.medium 欄位中設置「memory」,Kubernetes 將掛載一個由 RAM 支援的檔案系統(tmpfs)。請注意,Kubernetes 會在節點重新開機時清除 tmpfs。

Kubernetes hostPath Volume

hostPath 磁碟區會將主機節點檔案系統中的目錄或檔案掛載到 Pod 中。

以下是 hostPath Volume 的主要使用案例:

  • 使用 /var/lib/dockerhostPath—執行需要存取 Docker 內部結構的容器。
  • 使用 /sys hostPath—在容器中運行 cAdvisor。
  • 允許 Pod 指定 hostPath—以定義在 Pod 開始運行之前是否應該存在某個 hostPath 以及是否應創建它。
  • 指定 hostPath 磁碟區的類型—除了必需的路徑屬性之外,您還可以設定此類型。

HostPath 磁碟區安全性
HostPath 磁碟區會帶來許多安全風險。請盡可能避免使用這些磁碟區。如果必須使用 HostPath 磁碟區,則應僅將其範圍限定為所需的目錄或檔案,並將其掛載為 ReadOnly。

以下是主要的安全風險:

  • 公開的憑據—HostPaths 可以公開特權系統憑據或特權 API。威脅參與者可以使用它來攻擊叢集的其他部分或用於容器逃逸。
  • Root 權限—在底層主機上建立的任何目錄或檔案只能由 root 寫入。如果要寫入 hostPath 磁碟區,則需要修改主機上的檔案權限,或者在特權容器中以 root 使用者身分執行程序。

您可以使用 AdmissionPolicy 來限制 HostPath 對某些目錄的存取。但是,僅當您需要 volumeMounts 使用 readOnly 掛載時,該原則才有效。

Kubernetes 卷 ConfigMap

ConfigMap 允許將配置數據注入 Pod。儲存在 ConfigMap 中的數據可以在 configMap 卷類型中引用,然後由在 Pod 中執行的容器化應用程式使用。參考 ConfigMap 時,需要在卷中提供 ConfigMap 的名稱。Kubernetes 允許您自訂 ConfigMap 中特定條目的路徑。

用於儲存 Kubernetes Volume 的外掛程式

Kubernetes 提供了多個儲存外掛程式,用於存取部署在 Kubernetes 叢集中的儲存裝置。這些是使用 StorageClass 物件實現的。

Kubernetes 目前支援的一些主要外掛程式包括 GCEPersistentDisk、AWSElasticBlockStore、AzureDisk、Glusterfs、NFS 和 iSCSI。有關這些外掛程式的更多詳細資訊,請參閱 StorageClass 文件

讓我們更詳細地回顧兩個值得注意的儲存外掛程式。

NFS

Network File System (NFS) 是用於將儲存設備掛載為本機磁碟機的標準通訊協定。Kubernetes 允許您將 NFS 磁碟區掛載為容器中的本機磁碟機。由於舊版程式碼經常透過 NFS 存取資料,因此此外掛程式對於將舊版工作負載移轉至 Kubernetes 非常有用。

透過 NFS 和 Kubernetes 存取資料有兩種方式:

  • 臨時 NFS Volume —可以附加到現有的 NFS 儲存空間。
  • PersistentVolumes 使用 NFS—允許您在叢集上設定可透過 NFS 存取的託管資源。

CSI

容器儲存介面(CSI)是一個標準介面,允許容器協調器將儲存系統公開給他們管理的容器。CSI 允許儲存廠商建立「樹外」外掛程式,這意味著它們不需要簽入 Kubernetes 程式碼儲存庫,也不隨 Kubernetes 一起提供。

有許多基於 CSI 的樹外外掛程式由儲存供應商直接提供。CSI 的出現使儲存技術支援 Kubernetes 變得更加容易。

相關內容:閱讀我們的 Container Storage Interface 指南

什麼是 Kubernetes volumeMounts?

建立磁碟區並使 Pod 能夠存取磁碟區涉及兩個步驟:

  • 在 Pod 範本的 spec:volumes 屬性中聲明它,然後在某些節點上部署 Pod
  • 使用 spec:containers::volumeMounts 屬性將磁碟區掛載到特定容器

這些步驟是相輔相成的。建立磁碟區時,還必須將其掛載到容器,而且如果不在 Pod 範本中宣告磁碟區,則無法掛載磁碟區。

以下範例顯示了在 pod 範本 YAML 設定中建立和掛載磁碟區:

spec: containers: —name: my-app image: nginx volumeMounts: —name: my-volume mountPath: /app/config volumes: —name: my-volume 

在此程式碼中:

  • volumes(位於底部)建立一個名為 my-volume 的 volume 並將其附加到 pod
  • volumeMounts 定義磁碟區的掛載方式,包括從容器內部存取磁碟區的檔案路徑
  • 必須在兩個位置使用相同的磁碟區名稱,即磁碟區宣告和 volumeMounts 屬性。

透過部署 Pod 建立 Kubernetes Volume

若要建立 Kubernetes Volume,您需要部署一個或多個宣告該 Volume 的 Pod。執行此操作的常見方法是透過 Deployment 物件。以下是執行下列操作的 Deployment 資訊清單範例:

  • 部署三個 Pod,每個 Pod 都有一個 NGINX 容器
  • 宣告 emptyDir 磁碟區
  • 將磁碟區掛載到根目錄下的三個容器中的每一個
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 物件執行建立磁碟區所需的兩個動作:

  • spec:template:volumes 屬性宣告磁碟區。
  • spec:containers::volumeMounts 屬性將磁碟區掛載到容器。

假設此 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 進行 Kubernetes Volume 管理

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 如何幫助解決容器化應用程式的挑戰。

Drift chat loading