Azure Arc 所啟用 AKS 中應用程式的記憶體選項

適用於:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS

使用 Azure Arc 所啟用 Azure Kubernetes Service 在 AKS 部署中執行的應用程式可能需要儲存和擷取數據。 針對部分應用程式的工作負載,當刪除 Pod 時,資料可以在不需要的節點上使用本機快速儲存體 (Kubernetes 會使用 Pod 來執行應用程式的執行個體)。

其他工作負載可能需要在較一般數據磁碟區上保存的記憶體。 如果 Pod 在不同的節點上重新排程,則多個 Pod 可能需要共用相同的數據磁碟區,或重新附加數據磁碟區。 此外,如果 Pod 包含敏感資料或應用程式組態資訊,您可能需要記憶體選項。

顯示叢集主要和節點的架構記憶體映像。

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

  • 磁碟區
  • 永續性磁碟區
  • 儲存類別
  • 永續性磁碟區宣告 (PVC)

磁碟區

應用程式通常必須能夠儲存和擷取資料。 由於 Kubernetes 通常會將個別的 Pod 視為暫時性的可處置資源,因此可以不同的方法讓應用程式使用和保存資料。 磁碟區就是可跨 Pod 和應用程式生命週期儲存、擷取和保存資料的方式之一。

在 Kubernetes 中,磁碟區不僅代表儲存和擷取資訊的傳統。 Kubernetes 磁碟區也可用來將資料插入 Pod 中,供容器使用。 一些常見的 Kubernetes 磁碟區類型包含:

  • emptyDir - 此磁碟區通常作為 Pod 的暫存空間。 Pod 內的所有容器都可存取磁碟區上的資料。 寫入此磁碟區類型的資料只會在 Pod 的存留期內保存 - 當 Pod 遭刪除後,磁碟區集會刪除。 雖然此磁碟區也可單獨存在於節點的記憶體中,但其通常會使用基礎本機節點的磁碟儲存體。

  • secret - 此磁碟區用來將敏感數據,例如密碼包含在 Pod 中。 首先,您必須使用 Kubernetes API 建立祕密。 定義 Pod 或部署時,您可以要求特定的秘密。 秘密只會提供給具有需要其排程 Pod 的節點,而秘密會儲存在 tmpfs 中,而不會寫入磁碟。 當需要秘密的節點上的最後一個 Pod 被刪除時,就會從節點的 tmpfs 中刪除秘密。 祕密儲存在指定的命名空間內,且僅供相同命名空間中的 Pod 存取。

  • configMap - 此磁碟區類型可用來將索引鍵/值組屬性插入 Pod 中,例如應用程式設定資訊。 您無須將應用程式設定資訊定義於容器映像內,而可以將其定義為 Kubernetes 資源,以便在 Pod 的新執行個體部署時為其更新和套用該資源。 類似於使用秘密,您必須先使用 Kubernetes API 建立 ConfigMap 。 當您定義Pod或部署時,就可以要求此 ConfigMapConfigMap 會儲存在指定的命名空間內,而且只能由相同命名空間內的 Pod 存取。

永續性磁碟區

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

您可以使用以 ReadWriteOnce 形式掛接的 VHDX 所支援的 AKS 磁碟區,一次可以存取單一節點。 或者,您可以使用SMB或NFS檔案共享支援的AKS檔案磁碟區。 這些磁碟區會掛接為 ReadWriteMany,並且可同時供多個節點使用。

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

儲存類別

若要定義記憶體的不同層 (和位置) ,您可以建立 StorageClassStorageClass 也會定義 reclaimPolicy。 此 reclaimPolicy 會控制刪除 Pod 時基礎記憶體資源的行為,而且可能不再需要永續性磁碟區。 您可刪除基礎儲存體資源,或將其保留以供未來的 Pod 使用。

在 AKS Arc 中, 會自動建立預設 儲存類別,並使用 CSV 來建立 VHDX 支援的磁碟區。 當所用的永續性磁碟區遭刪除時,回收原則可確保將基礎 VHDX 刪除。 儲存類別也會將永續性磁碟區設為可展開,因此您只需要以新的大小來編輯永續性磁碟區宣告。

如果未為永續性磁碟區指定 StorageClass ,則會使用預設 的 StorageClass 。 要求永續性磁碟區時,請確定它們使用適當的記憶體。 您可以為其他需求建立 StorageClass

永續性磁碟區宣告

PersistentVolumeClaim 會要求特定 StorageClass 和大小的 ReadWriteOnceReadWriteMany 記憶體。 Kubernetes API 伺服器可以在 AKS Arc 中動態布建基礎記憶體資源,如果沒有現有的資源可根據定義的 StorageClass 來完成宣告。 在磁碟區連線至 Pod 後,Pod 定義即會包含磁碟區掛接。

一旦將可用的記憶體資源指派給要求它的 Pod,PersistentVolumeClaim 就會系結至 PersistentVolumeClaim 永續性磁碟區與宣告之間有 1:1 的對應。

下列範例 YAML 指令清單顯示使用預設 StorageClass 並要求 5Gi 磁碟的永續性磁碟區宣告:

apiVersion: v1 
kind: PersistentVolumeClaim 
metadata: 
  name: aks-hci-vhdx 
spec: 
  accessModes: 
  - ReadWriteOnce 
  storageClassName: default 
  resources: 
    requests: 
      storage: 5Gi 

當您建立 Pod 定義時,您會指定永續性磁碟區宣告應要求所需的儲存體。 您接著也會指定 volumeMount 應用程式讀取與寫入資料的 。 下列為範例 YAML 資訊清單,其會說明先前永續性磁碟區宣告在 /mnt/aks-hci 掛接磁碟區的方式:

kind: Pod 
apiVersion: v1 
metadata: 
  name: nginx 
spec: 
  containers: 
    - name: myfrontend 
      image: k8s.gcr.io/nginx 
      volumeMounts: 
      - mountPath: "/mnt/aks-hci" 
        name: volume
  nodeSelector:
      kubernetes.io/os: linux
  volumes: 
    - name: volume 
      persistentVolumeClaim: 
        claimName: aks-hci-vhdx 

下列範例示範如何在 Windows 容器中掛接磁碟區,並指定驅動器號和路徑:

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

後續步驟