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

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

多個 Pod 可能需要:

  • 共用相同的數據磁碟區。
  • 如果 Pod 重新排程在不同的節點上,請重新附加數據磁碟區。

您可能也需要將敏感資料或應用程式組態資訊收集並儲存到 Pod 中。

本文介紹在 AKS 中為您的應用程式提供記憶體的核心概念:

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

暫時 OS 磁碟

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

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

注意

當您未明確要求 OS 的 Azure 受控磁碟 時,如果指定的節點集區組態可能的話,AKS 預設為暫時 OS。

Azure VM 檔中提供暫時 OS 磁碟的大小需求和建議。 以下是一些一般大小考慮:

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

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

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

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

  • 如果您要求與 60 GiB OS 磁碟相同的 Standard_E2bds_v5 VM 大小,此設定預設為暫時的 OS 磁碟。 要求的 60 GiB 大小小於 75 GiB 的最大暫存空間。

  • 如果您選取 Standard_E4bds_v5 具有 100-GiB OS 磁碟的 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 資源。 磁碟類型包括:

  • Ultra 磁碟
  • 進階 SSD
  • 標準 SSD
  • 標準 HDD

提示

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

由於 Azure 磁碟會掛接為 ReadWriteOnce,因此只能供單一節點使用。 若要讓 Pod 同時存取多個節點上的記憶體磁碟區,請使用 Azure 檔案儲存體。

Azure 檔案儲存體

使用 Azure 檔案儲存體 將 Azure 記憶體帳戶支援的伺服器訊息塊 (SMB) 3.1.1 版共用或網路檔案系統 (NFS) 4.1 版共用掛接至 Pod。 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 時輕鬆更新並套用至新的 Pod 實例。

就像使用秘密一樣:

  1. 使用 Kubernetes API 建立 ConfigMap。
  2. 當您定義Pod或部署時,請要求 ConfigMap。
    • Config 地圖 會儲存在指定的命名空間內,而且只能由相同命名空間內的 Pod 存取。

永續性磁碟區

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

您可以使用下列 Azure 儲存體 資料服務來提供 PersistentVolume:

如磁碟區一節所述,磁碟或檔案的選擇通常取決於同時存取數據或效能層的需求。

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

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

重要

由於兩個操作系統之間的文件系統支持差異,Windows 和 Linux Pod 無法共用永續性磁碟區。

儲存類別

若要定義不同的記憶體層級,例如 進階版 和 Standard,您可以建立 儲存體 Class

StorageClass 也會定義 reclaimPolicy。 當您刪除永續性磁碟區時,reclaimPolicy 會控制基礎 Azure 儲存體資源的行為。 可以删除基礎儲存體資源,也可以保留它以供將來的 Pod 使用。

針對使用容器 儲存體 介面 (CSI) 驅動程式叢集,會建立下列額外專案StorageClasses

儲存類別 描述
managed-csi 使用 Azure StandardSSD 本地備援儲存體 (LRS) 建立受控磁碟。 回收原則可確保在使用基礎 Azure 磁碟的永續性磁碟區遭到刪除時刪除。 儲存類別也會將永續性磁碟區設定為可擴充,您只需要編輯具有新大小的永續性磁碟區宣告。
managed-csi-premium 使用 Azure 進階本地備援儲存體 (LRS) 建立受控磁碟。 回收原則會再次確保刪除使用基礎 Azure 磁碟的永續性磁碟區時,會刪除基礎 Azure 磁碟。 同樣地,此記憶體類別允許擴充永續性磁碟區。
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 記憶體容器的永續性磁碟區遭到刪除時刪除。

除非為永續性磁碟區指定 StorageClass,否則將使用預設 StorageClass。 請確定磁碟區會使用要求永續性磁碟區時所需的適當記憶體。

重要

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

類別 default 會與 managed-csi相同。

您可以使用 建立 儲存體 Class,以滿足其他需求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 中的 儲存體 Class。

永續性磁碟區宣告

PersistentVolumeClaim 會要求儲存特定 儲存體 Class、存取模式和大小。 如果現有的資源無法根據定義的 儲存體 Class 完成宣告,Kubernetes API 伺服器可以動態布建基礎 Azure 記憶體資源。

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

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

一旦將可用的儲存體資源指派給 Pod 要求儲存體之後,PersistentVolume 就會「繫結」至 PersistentVolumeClaim。 永續性磁碟區是對應至宣告的 1:1。

下列範例 YAML 指令清單顯示永續性磁碟區宣告,該宣告會使用受控進階 儲存體 Class,並要求大小為 Disk 5Gi

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

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

  • 要求所需記憶體的永續性磁碟區宣告。
  • 要讀取和寫入數據的應用程式的 volumeMount

下列範例 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 概念的詳細資訊,請參閱下列文章: