Azure Kubernetes Service (AKS) 中的應用程式適用的儲存體選項

Azure Kubernetes Service (AKS) 中執行的應用程式可能需要儲存和擷取資料。 雖然某些應用程式工作負載可以使用本機、快速的儲存體,但不需要的節點,但其他工作負載則需要在 Azure 平臺內更週期性資料磁片區上保存的儲存體。

多個 Pod 可能需要:

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

最後,您可能需要將敏感性資料或應用程式設定資訊插入 Pod 中。

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

Storage options for applications in an Azure Kubernetes Services (AKS) cluster

磁碟區

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

傳統磁片區會建立為Azure 儲存體支援的 Kubernetes 資源。 您可以手動建立要直接指派給 Pod 的資料磁片區,或讓 Kubernetes 自動建立它們。 資料磁片區可以使用:Azure 磁片Azure 檔案儲存體Azure NetApp FilesAzure Blob

Azure 磁碟

使用 Azure 磁片 來建立 Kubernetes DataDisk 資源。 磁片類型包括:

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

提示

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

由於 Azure 磁片會掛接為 ReadWriteOnce,因此只能供單一 Pod 使用。 對於可同時由多個 Pod 存取的儲存體磁片區,請使用Azure 檔案儲存體。

Azure 檔案

使用Azure 檔案儲存體,將 Azure 儲存體帳戶支援的 SMB 3.1.1 共用或 NFS 4.1 共用掛接至 Pod。 檔案可讓您跨多個節點和 Pod 共用資料,而且可以使用:

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

Azure NetApp Files

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

Azure Blob 儲存體

  • 區塊 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。
    • ConfigMap 會儲存在指定的命名空間內,且僅供相同命名空間中的 Pod 存取。

永續性磁碟區

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

您可以使用 Azure 磁片或檔案來提供 PersistentVolume。 如 磁片區 一節所述,磁片或檔案的選擇通常取決於同時存取資料或效能層的需求。

Persistent volumes in an Azure Kubernetes Services (AKS) cluster

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

儲存類別

若要定義不同層級的儲存體 (例如進階和標準),您可以建立 StorageClass

StorageClass 也會定義 reclaimPolicy。 當您刪除 Pod 和永續性磁片區不再需要時,reclaimPolicy 會控制基礎 Azure 儲存體資源的行為。 基礎儲存體資源可以刪除或保留,以便與未來的 Pod 搭配使用。

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

權限 原因
managed-csi 使用 Azure StandardSSD 本地備援儲存體 (LRS) 來建立受控磁片。 回收原則可確保在使用基礎 Azure 磁碟的永久性磁碟區遭到刪除時,會刪除該磁碟。 儲存體類別也會將永續性磁片區設定為可擴充,您只需要以新的大小編輯永續性磁片區宣告。
managed-csi-premium 使用 Azure 進階版本地備援儲存體 (LRS) 來建立受控磁片。 回收原則可確保在使用基礎 Azure 磁碟的永久性磁碟區遭到刪除時,會刪除該磁碟。 同樣地,此儲存類別允許擴充永續性磁片區。
azurefile-csi 使用 Azure 標準儲存體來建立 Azure 檔案共用。 回收原則可確保在使用基礎 Azure 檔案共用的永久性磁碟區遭到刪除時,會刪除該檔案共用。
azurefile-csi-premium 使用 Azure 進階版儲存體來建立 Azure 檔案共用。 回收原則可確保在使用基礎 Azure 檔案共用的永久性磁碟區遭到刪除時,會刪除該檔案共用。

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

重要

從 Kubernetes 1.21 版開始,AKS 預設只會使用 CSI 驅動程式。 類別 default 會與 相同 managed-csi

您可以使用 kubectl 建立 StorageClass,以因應其他需求。 下列範例會使用 進階版 受控磁碟,並指定刪除 Pod 時應保留基礎 Azure 磁片:

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

注意

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

永續性磁碟區宣告

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

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

Persistent volume claims in an Azure Kubernetes Services (AKS) cluster

一旦將可用的儲存體資源指派給要求儲存體的 Pod,PersistentVolume 就會 系結 至 PersistentVolumeClaim。 持續性磁片區是對應至宣告的 1:1。

下列範例 YAML 資訊清單顯示使用 managed-premium StorageClass 並要求 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 中的儲存和備份最佳做法

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

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