Azure Kubernetes Service (AKS) 中應用程式的儲存體選項 (部分機器翻譯)

在 Azure Kubernetes Service (AKS) 中執行的應用程式可能會需要儲存和擷取資料。 雖然某些應用程式工作負載可以在不需要、清空的節點上使用本機、快速的儲存體,但其他工作負載則需要在 Azure 平台內保存於較一般資料磁碟區的儲存體。

可能會需要多個 Pod:

  • 共用相同的資料磁碟區。
  • 如果 Pod 於不同節點上進行重新排程,則重新連結資料磁碟區。

您可能也需要收集敏感性資料或應用程式設定資訊並儲存至 Pod。

本文將介紹為 AKS 中的應用程式提供儲存體的核心概念:

Azure Kubernetes Services (AKS) 叢集中應用程式的記憶體選項圖表。

暫時 OS 磁碟

根據預設,Azure 會自動復寫虛擬機的作業系統磁碟,以 Azure 儲存體 以避免 VM 重新放置到另一部主機時遺失數據。 不過,由於容器不是設計來保存本機狀態,因此,此行為提供的價值有限,同時還會有一些缺點。 這些缺點包括但不限於節點佈建較慢及更高的讀取/寫入延遲。

相較之下,暫時性 OS 磁碟只會儲存在主機電腦上,就像暫存磁碟一樣。 藉由此設定,您可以取得更低的讀取/寫入延遲,以及更快的節點縮放和叢集升級。

注意

當您未明確要求適用於 OS 的 Azure 受控磁碟 (部分機器翻譯) 時,如果指定的節點集區設定可能的話,AKS 就會預設為暫時性 OS。

Azure VM 文件 (部分機器翻譯) 中提供暫時性 OS 磁碟的大小需求和建議。 以下是一些一般調整大小考量:

  • 如果您選擇使用預設 OS 磁碟大小為 100 GiB 的 AKS 預設 VM 大小 Standard_DS2_v2 SKU,預設 VM 大小就會支援暫時性 OS,但快取大小只有 86 GiB。 如果您未明確指定,此設定會預設為受控磁碟。 如果您確實要求暫時性 OS,則會收到驗證錯誤。

  • 如果您要求 OS 磁碟為 60 GiB 的相同 Standard_DS2_v2 SKU,此設定就會預設為暫時性 OS。 60 GiB 的要求大小小於 86 GiB 的快取大小上限。

  • 如果您選取 OS 磁碟為 100 GB 的 Standard_D8s_v3 SKU,此 VM 大小就會支援暫時性 OS,且快取空間為 200 GiB。 如果您未指定 OS 磁碟類型,則節點集區預設會收到暫時性 OS。

最新一代的 VM 系列沒有專用快取,但只有暫存儲存體。 例如,如果您選取預設 OS 磁碟大小為 100 GiB 的 Standard_E2bds_v5 VM 大小,則其支援暫時性 OS 磁碟,但暫存儲存體只有 75 GB。 如果您未明確指定,此設定會預設為受控 OS 磁碟。 如果您確實要求暫時性 OS 磁碟,則會收到驗證錯誤。

  • 如果您要求 OS 磁碟為 60 GiB 的相同 Standard_E2bds_v5 VM 大小,此設定就會預設為暫時性 OS 磁碟。 要求的 60 GiB 大小小於 75 GiB 的暫存儲存體上限。

  • 如果您選取 OS 磁碟為 100 GiB 的 Standard_E4bds_v5 SKU,此 VM 大小就會支援暫時性 OS,且暫存儲存體為 150 GiB。 如果您未指定 OS 磁碟類型,Azure 預設會將暫時性 OS 磁碟佈建至節點集區。

客戶管理的金鑰

您可以在 AKS 叢集上使用自己的金鑰來管理暫時性 OS 磁碟的加密。 如需詳細資訊,請參閱搭配 AKS 上的 Azure 磁碟使用客戶自控金鑰 (部分機器翻譯)。

磁碟區

Kubernetes 通常會將個別 Pod 視為短暫且可處置的資源。 應用程式有不同方法可供使用及保存資料。 磁碟區就是可跨 Pod 和應用程式生命週期儲存、擷取和保存資料的方式之一。

用來儲存和擷取資料的傳統磁碟區,會建立為受 Azure 儲存體所支援的 Kubernetes 資源。 您可以手動建立資料磁碟區以供直接指派給 Pod,也可以讓 Kubernetes 自動建立它們。 資料磁碟區可以使用:Azure 磁碟Azure 檔案儲存體Azure NetApp FilesAzure Blob

注意

根據您使用的 VM SKU,Azure 磁碟 CSI 驅動程式可能具有每個節點的磁碟區限制。 針對某些高效能 VM (例如 16 個核心),每個節點的限制為 64 個磁碟區。 若要識別每個 VM SKU 的限制,請檢閱所提供之每個 VM SKU 的最大資料磁碟資料行。 如需所提供之 VM SKU 清單與其對應的詳細容量限制,請參閱一般用途虛擬機器大小 (部分機器翻譯)。

若要協助判斷 Azure 檔案儲存體與 Azure NetApp Files 之間最適合的工作負載,請檢閱 Azure 檔案儲存體和 Azure NetApp Files 的比較一文 (部分機器翻譯) 中提供的資訊。

Azure 磁碟

使用 Azure 磁碟 (部分機器翻譯) 來建立 Kubernetes DataDisk 資源。 磁碟類型包括:

  • 進階版 SSD (建議用於大多數工作負載)
  • Ultra 磁碟
  • 標準 SSD
  • 標準 HDD

提示

針對大部分的生產與開發工作負載,請使用 進階版 SSD。

因為 Azure 磁碟會掛接為 ReadWriteOnce,所以只能供單一節點使用。 針對多個節點上的 Pod 可同時存取的儲存體磁碟區,請使用 Azure 檔案儲存體。

Azure 檔案

使用 Azure 檔案儲存體 掛接伺服器消息塊 (SMB) 3.1.1 版共用或網路文件系統 (NFS) 4.1 版共用。 Azure 檔案儲存體能讓您在多個節點和 Pod 之間共用資料:

  • 高效能 SSD 支援的 Azure 進階儲存體
  • 一般 HDD 支援的 Azure 標準儲存體

Azure NetApp Files

  • Ultra Storage
  • 進階儲存體
  • 標準儲存體

Azure Blob 儲存體

使用 Azure Blob 儲存體建立 Blob 儲存體容器,然後使用 NFS v3.0 通訊協定或 BlobFuse 掛接。

  • 區塊 Blob

磁碟區類型

Kubernetes 磁碟區不只是用來將資訊儲存和擷取的傳統磁碟。 Kubernetes 磁碟區也可用來將數據插入 Pod,以供其容器使用。

Kubernetes 中常見的其他磁碟區類型包含:

emptyDir

通常用來作為 Pod 的暫存空間。 Pod 內的所有容器都可存取此磁碟區上的資料。 寫入至此磁碟區類型的資料只會在 Pod 的存留期內保存。 當您刪除 Pod 之後,此磁碟區就會遭到刪除。 此磁碟區通常會使用基礎本機節點磁碟儲存體,但也只能留存於節點的記憶體中。

secret

您可以使用祕密磁碟區來將敏感性資料插入 Pod 中,例如密碼。

  1. 使用 Kubernetes API 建立秘密。
  2. 定義您的 Pod 或部署,並要求特定的秘密。
    • 祕密只會提供給已排程 Pod 所需要的祕密節點。
    • 秘密會儲存在 tmpfs,而不是寫入磁碟。
  3. 當您在需要秘密的節點上刪除最後一個 Pod 時,密碼會從節點的 tmpfs 中刪除。
    • 祕密會儲存在指定的命名空間內,且僅供相同命名空間中的 Pod 存取。

configMap

您可以使用 configMap 來將機碼值組屬性插入 Pod,例如應用程式設定資訊。 將應用程式設定資訊定義為 Kubernetes 資源,不只能輕鬆更新,還能將已部署的 Pod 應用至新的執行個體。

如同使用祕密:

  1. 使用 Kubernetes API 來建立 ConfigMap。
  2. 在您定義 Pod 或部署時,可要求 ConfigMap。
    • ConfigMaps 會儲存在指定的命名空間內,且僅供相同命名空間中的 Pod 存取。

永續性磁碟區

磁碟區會定義並建立為 Pod 生命週期的一部分,且在 Pod 刪除後就不會存在。 如果 Pod 在維護事件期間重新排程於不同的主機上,Pod 通常會預期其儲存體能持續保存,尤其是在 StatefulSets 中。 永續性磁碟區 (PV) 是由 Kubernetes API 建立和管理的儲存體資源,可跨個別 Pod 的存留期持續保存。

您可以使用下列 Azure 儲存體 資料服務來提供永續性磁碟區:

如磁碟區一節所述,選擇 Azure 磁碟或 Azure 檔案儲存體 通常取決於數據或效能層級的並行存取需求。

Azure Kubernetes Services (AKS) 叢集中永續性磁碟區的圖表。

叢集管理員可以以靜態方式建立永續性磁碟區,或 Kubernetes API 伺服器可以動態建立磁碟區。 如果 Pod 已排程並要求目前無法使用的記憶體,Kubernetes 可以建立基礎 Azure 磁碟或檔案記憶體,並將其連結至 Pod。 動態布建會使用 記憶體類別 來識別需要建立的資源類型。

重要

Windows 和 Linux Pod 無法共用永續性磁碟區,因為這兩個作業系統之間的檔案系統支援存在差異。

儲存類別

若要指定不同層級的記憶體,例如進階或標準,您可以建立 記憶體類別

記憶體類別也會定義 回收原則。 當您刪除永續性磁碟區時,回收原則會控制基礎 Azure 儲存體 資源的行為。 基礎資源可以刪除或保留,以便與未來的Pod搭配使用。

針對使用容器 儲存體 介面 (CSI) 驅動程式叢集,會建立下列額外的記憶體類別:

儲存類別 描述
managed-csi 使用 Azure 標準 SSD 本地備援記憶體 (LRS) 來建立受控磁碟。 回收原則可確保在使用基礎 Azure 磁碟的永久性磁碟區遭到刪除時,會刪除該磁碟。 記憶體類別也會將永續性磁碟區設定為可擴充。 您可以編輯永續性磁碟區宣告,以指定新的大小。 從 Kubernetes 1.29 版開始,在跨多個可用性區域部署的 Azure Kubernetes Service (AKS) 叢集中,此記憶體類別會利用 Azure 標準 SSD 區域備援記憶體 (ZRS) 來建立受控磁碟。
managed-csi-premium 使用 Azure 進階版 本地備援記憶體 (LRS) 來建立受控磁碟。 回收原則可確保在使用基礎 Azure 磁碟的永久性磁碟區遭到刪除時,會刪除該磁碟。 同樣地,此儲存類別允許將永續性磁片區展開。 從 Kubernetes 1.29 版開始,在跨多個可用性區域部署的 Azure Kubernetes Service (AKS) 叢集中,此記憶體類別會利用 Azure 進階版 區域備援記憶體 (ZRS) 來建立受控磁碟。
azurefile-csi 使用 Azure 標準儲存體來建立 Azure 檔案共用。 回收原則可確保在使用基礎 Azure 檔案共用的永續性磁碟區遭到刪除時,會刪除該檔案共用。
azurefile-csi-premium 使用 Azure 進階儲存體來建立 Azure 檔案共用。 回收原則可確保在使用基礎 Azure 檔案共用的永續性磁碟區遭到刪除時,會刪除該檔案共用。
azureblob-nfs-premium 使用 Azure 進階儲存體建立 Azure Blob 儲存體容器,然後使用 NFS v3 通訊協定連線。 回收原則確保在删除使用基礎 Azure Blob 儲存體容器的永續性磁碟區時删除該容器。
azureblob-fuse-premium 使用 Azure 進階儲存體建立 Azure Blob 儲存體容器,並使用 BlobFuse 進行連線 回收原則確保在删除使用基礎 Azure Blob 儲存體容器的永續性磁碟區時删除該容器。

除非您為永續性磁碟區指定儲存類別,否則會使用預設儲存類別。 當您要求永續性磁碟區時,請確認所需要的適當儲存體。

重要

從 Kubernetes 版本 1.21 開始,AKS 預設只使用 CSI 驅動程式,並且啟用了 CSI 移轉。 雖然現有樹狀內永續性磁碟區從版本 1.26 開始繼續執行,但 AKS 將不再支援使用樹狀內驅動程式建立的磁碟區以及為檔案和磁碟佈建的儲存體。

default 類別將會與 managed-csi 相同。

從 Kubernetes 1.29 版開始,當您跨多個可用性區域部署 Azure Kubernetes Service (AKS) 叢集時,AKS 現在會利用區域備援記憶體 (ZRS) 在內建記憶體類別內建立受控磁碟。 ZRS 可確保跨所選區域中多個 Azure 可用性區域的 Azure 受控磁碟同步復寫。 此備援策略可增強應用程式的復原能力,並保護您的數據免於數據中心失敗。

不過,請務必注意,相較於本地備援記憶體(LRS),區域備援記憶體(ZRS)的成本較高。 如果成本優化是優先順序,您可以建立新的記憶體類別, skuname 並將 參數設定為 LRS。 接著,您可以在永續性磁碟區宣告 (PV) 中使用新的儲存類別。

您可以使用 ,為其他需求 kubectl建立記憶體類別。 下列範例會使用進階受控磁碟,並指定刪除Pod時應 保留 基礎 Azure 磁碟:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-premium-retain
provisioner: disk.csi.azure.com
parameters:
  skuName: Premium_ZRS
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

注意

AKS 會協調預設的儲存類別,並且覆寫您對於這些儲存體類別所做的任何變更。

如需儲存類別的詳細資訊,請參閱 Kubernetes 中的 StorageClass (英文)。

永續性磁碟區宣告

永續性磁碟區宣告 (PV) 會要求儲存特定儲存類別、存取模式和大小。 如果現有的資源無法根據定義的記憶體類別完成宣告,Kubernetes API 伺服器可以動態布建基礎 Azure 儲存體 資源。

在磁碟區連線至 Pod 後,Pod 定義即會包含磁碟區掛接。

Azure Kubernetes Services (AKS) 叢集中永續性磁碟區宣告的圖表。

將可用的記憶體資源指派給要求記憶體的 Pod 之後,永續性磁碟區會 繫結 至永續性磁碟區宣告。 永續性磁碟區會對應至 1:1 對應中的宣告。

下列範例 YAML 指令清單會顯示使用受控進階記憶體類別的永續性磁碟區宣告,並要求大小為 5Gi 的 Azure 磁碟:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: azure-managed-disk
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: managed-premium-retain
  resources:
    requests:
      storage: 5Gi

當您建立 Pod 定義時,也會指定:

  • 要求所需儲存體的永續性磁碟區宣告。
  • 應用程式要讀取和寫入數據的磁碟區掛接

下列範例 YAML 資訊清單說明如何使用先前的永續性磁碟區宣告在 /mnt/azure 上掛階磁碟區:

kind: Pod
apiVersion: v1
metadata:
  name: nginx
spec:
  containers:
    - name: myfrontend
      image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
      volumeMounts:
      - mountPath: "/mnt/azure"
        name: volume
  volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: azure-managed-disk

如果要在 Windows 容器中掛接磁碟區,請指定磁碟機代號和路徑。 例如:

...      
      volumeMounts:
      - mountPath: "d:"
        name: volume
      - mountPath: "c:\k"
        name: k-dir
...

下一步

如需相關聯的最佳做法,請參閱 AKS 中儲存體與備份的最佳做法 (部分機器翻譯) 和 AKS 儲存體考量 (部分機器翻譯)。

若要查看如何使用 CSI 驅動程式,請參閱下列操作說明文章:

如需有關 Kubernetes 及 AKS 核心概念的詳細資訊,請參閱下列文章: