搭配本機 NVMe 和磁碟區復寫使用 Azure 容器儲存體

Azure 容器儲存體是雲端式磁碟區管理、部署和協調流程服務,專為容器原生建置。 本文說明如何設定 Azure 容器儲存體以使用暫時性磁碟搭配本機 NVMe 和磁碟區複寫,做為 Kubernetes 工作負載的後端儲存體。 最後,您將擁有使用本機 NVMe 做為其儲存體的 Pod。 複寫跨不同節點上的磁碟區複製資料,並在複本遺失時還原磁碟區,從而為暫時性磁碟提供了復原性。

什麽是暫時性磁碟?

當您的應用程式需要不到一毫秒的儲存體延遲時,您可以將暫時性磁碟與 Azure 容器儲存體一起使用以滿足您的效能需求。 暫時性表示磁碟部署在託管 AKS 叢集的本機虛擬機器 (VM) 上,而非儲存至 Azure 儲存體服務。 如果您停止/解除配置 VM,則這些磁碟上的資料將會遺失。

有兩種類型的暫時性磁碟可用:本機 NVMe 和暫存 SSD。 NVMe 是為儲存體和 CPU 之間的高速資料傳輸而設計的。 當您的應用程式需要比暫存 SSD 更高的 IOPS 或輸送量,或需要更多儲存空間時,請選擇 NVMe。 請注意,Azure 容器儲存體僅支援本機 NVMe 的同步資料複寫。

由於這些磁碟的暫時性質,在使用暫時性磁碟時,Azure 容器儲存體預設支援使用一般暫時性磁碟區。 不過,某些使用案例可能需要永續性磁碟區 (即使資料不持久也一樣);例如,如果您想要使用現有的 YAML 檔案或硬式編碼的部署範本來使用永續性磁碟區,而且您的工作負載支援應用程式層級複寫以實現持久性的情況。 在這種情況下,您可以更新 Azure 容器儲存體安裝,並在永續性磁碟區宣告定義中新增註釋 acstor.azure.com/accept-ephemeral-storage=true,以支援從暫時性磁碟存放集區建立永續性磁碟區。

必要條件

  • 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

  • 本文需要最新版本 (2.35.0 或更新版本) 的 Azure CLI。 請參閱如何安裝 Azure CLI。 若您使用的是 Azure Cloud Shell 中的 Bash 環境,即已安裝最新版本。 如果您打算在本機執行命令,而不是在 Azure Cloud Shell 中執行命令,請務必使用系統管理權限來執行這些命令。 如需詳細資訊,請參閱開始使用 Azure Cloud Shell

  • 您將需要 Kubernetes 命令列用戶端,kubectl。 如果您使用 Azure Cloud Shell,則已安裝;您也可以執行 az aks install-cli 命令,在本機安裝。

  • 如果您尚未安裝 Azure 容器儲存體,請遵循將 Azure 容器儲存體與 Azure Kubernetes Service 一起使用中的指示。

  • 檢查您的目標區域是否受 Azure 容器儲存體區域支援。

選擇支援本機 NVMe 的 VM 類型

暫時性磁碟僅適用於特定類型的 VM。 如果您打算使用本機 NVMe,則需要儲存體最佳化 VM,例如 standard_l8s_v3

執行下列命令,以取得與節點集區搭配使用的 VM 類型。 將<resource group><cluster name> 取代為您自己的值。 您不需要提供 PoolNameVmSize 的值,因此請保留此處所示的查詢。

az aks nodepool list --resource-group <resource group> --cluster-name <cluster name> --query "[].{PoolName:name, VmSize:vmSize}" -o table

以下是輸出的範例。

PoolName    VmSize
----------  ---------------
nodepool1   standard_l8s_v3

我們建議每個 VM 至少有四個虛擬 CPU (vCPU),且每個節點集區至少有三個節點。

建立並連結一般暫時性磁碟區

請遵循下列步驟來建立及連結一般暫時性磁碟區。

1.建立具有磁碟區復寫的存放集區

首先,透過在 YAML 資訊清單檔中定義存放集區來建立存放集區,這是 Kubernetes 叢集的儲存體邏輯分組。

如果您使用 az aks createaz aks update 命令來啟用 Azure 容器儲存體,您可能已有存放集區。 使用 kubectl get sp -n acstor 來取得存放集區的清單。 如果您有要使用的存放集區,可以跳過本節,然後從顯示可用的儲存類別繼續。

請按照以下步驟,使用本機 NVMe 搭配複寫建立存放集區。 Azure 容器儲存體目前支援三個複本和五個複本組態。 如果您指定三個複本,則必須在 AKS 叢集中至少有三個節點。 如果您指定五個複本,則必須至少有五個節點。

注意

由於暫時性 OS 磁碟存放集區會取用所有可用的 NVMe 磁碟,因此您必須先刪除任何現有的本機 NVMe 存放集區,才能建立新的存放集區。

  1. 使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如 code acstor-storagepool.yaml

  2. 貼上下列程式碼並儲存檔案。 存放集區 name 值可以是您想要的任何值。

    apiVersion: containerstorage.azure.com/v1
    kind: StoragePool
    metadata:
      name: ephemeraldisk-nvme
      namespace: acstor
    spec:
      poolType:
        ephemeralDisk:
          diskType: nvme
          replicas: 3
    
  3. 套用 YAML 資訊清單檔以建立存放集區。

    kubectl apply -f acstor-storagepool.yaml 
    

    當存放集區建立完成時,您會看到如下的訊息:

    storagepool.containerstorage.azure.com/ephemeraldisk-nvme created
    

    您也可以執行此命令來檢查存放集區的狀態。 將 <storage-pool-name> 取代為您的存放集區 name 值。 對於此範例,此值會是 ephemeraldisk-nvme

    kubectl describe sp <storage-pool-name> -n acstor
    

建立存放集區時,Azure 容器儲存體會代表您建立儲存類別,並使用命名慣例 acstor-<storage-pool-name>

2.顯示可用的儲存類別

當存放集區準備好使用時,您必須選取儲存類別,以定義在建立及部署磁碟區時,如何動態建立儲存體。

執行 kubectl get sc 以顯示可用的儲存類別。 您應看到名為 acstor-<storage-pool-name> 的儲存類別。

$ kubectl get sc | grep "^acstor-"
acstor-azuredisk-internal   disk.csi.azure.com               Retain          WaitForFirstConsumer   true                   65m
acstor-ephemeraldisk-nvme        containerstorage.csi.azure.com   Delete          WaitForFirstConsumer   true                   2m27s

重要

請勿使用標示為 [內部] 的儲存類別。 這是 Azure 容器儲存體運作所需的內部儲存類別。

3.使用一般暫時性磁碟區部署 Pod

使用 Fio (彈性 I/O 測試器) 建立 Pod,以使用一般暫時性磁碟區進行基準測試和工作負載模擬。

  1. 使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如 code acstor-pod.yaml

  2. 貼上下列程式碼並儲存檔案。

    kind: Pod
    apiVersion: v1
    metadata:
      name: fiopod
    spec:
      nodeSelector:
        acstor.azure.com/io-engine: acstor
      containers:
        - name: fio
          image: nixery.dev/shell/fio
          args:
            - sleep
            - "1000000"
          volumeMounts:
            - mountPath: "/volume"
              name: ephemeralvolume
      volumes:
        - name: ephemeralvolume
          ephemeral:
            volumeClaimTemplate:
              metadata:
                labels:
                  type: my-ephemeral-volume
              spec:
                accessModes: [ "ReadWriteOnce" ]
                storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different
                resources:
                  requests:
                    storage: 1Gi
    

    當您變更磁碟區的儲存大小時,請確定大小小於單一節點暫時性磁碟的可用容量。 請參閱檢查節點暫時性磁碟容量

  3. 套用 YAML 資訊清單檔以部署 Pod。

    kubectl apply -f acstor-pod.yaml
    

    您應該會看到如下輸出:

    pod/fiopod created
    
  4. 檢查 Pod 是否正在執行,且暫時性磁碟區宣告已成功繫結至 Pod:

    kubectl describe pod fiopod
    kubectl describe pvc fiopod-ephemeralvolume
    
  5. 檢查 Fio 測試以查看其目前狀態:

    kubectl exec -it fiopod -- fio --name=benchtest --size=800m --filename=/volume/test --direct=1 --rw=randrw --ioengine=libaio --bs=4k --iodepth=16 --numjobs=8 --time_based --runtime=60
    

您現在已部署使用具有磁碟區復寫本機 NVMe 的 Pod,並可用於 Kubernetes 工作負載。

建立及連結永續性磁碟區

若要從暫時性磁碟存放集區建立永續性磁碟區,您必須在永續性磁碟區宣告 (PVC) 中包含註釋作為保護措施,以確保即使資料是暫時性的,您仍想要使用永續性磁碟區。 此外,在建立永續性磁碟區宣告之前,您需要在叢集上啟用具有 PersistentVolumeWithAnnotation 值的 --ephemeral-disk-volume-type 旗標。

請遵循下列步驟來建立及連結永續性磁碟區。

1.更新您的 Azure 容器儲存體安裝

執行下列命令來更新 Azure 容器儲存體安裝,以允許從暫時性磁碟存放集區建立永續性磁碟區。

az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage ephemeralDisk --storage-pool-option NVMe --ephemeral-disk-volume-type PersistentVolumeWithAnnotation 

2.建立具有磁碟區復寫的存放集區

請按照以下步驟,使用本機 NVMe 搭配複寫建立存放集區。 Azure 容器儲存體目前支援三個複本和五個複本組態。 如果您指定三個複本,則必須在 AKS 叢集中至少有三個節點。 如果您指定五個複本,則必須至少有五個節點。

注意

由於暫時性 OS 磁碟存放集區會取用所有可用的 NVMe 磁碟,因此您必須先刪除任何現有的本機 NVMe 存放集區,才能建立新的存放集區。

  1. 使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如 code acstor-storagepool.yaml

  2. 貼上下列程式碼並儲存檔案。 存放集區 name 值可以是您想要的任何值。 將複本設定為 3 或 5。

    apiVersion: containerstorage.azure.com/v1
    kind: StoragePool
    metadata:
      name: ephemeraldisk-nvme
      namespace: acstor
    spec:
      poolType:
        ephemeralDisk:
          diskType: nvme
          replicas: 3
    
  3. 套用 YAML 資訊清單檔以建立存放集區。

    kubectl apply -f acstor-storagepool.yaml 
    

    當存放集區建立完成時,您會看到如下的訊息:

    storagepool.containerstorage.azure.com/ephemeraldisk-nvme created
    

    您也可以執行此命令來檢查存放集區的狀態。 將 <storage-pool-name> 取代為您的存放集區 name 值。 對於此範例,此值會是 ephemeraldisk-nvme

    kubectl describe sp <storage-pool-name> -n acstor
    

建立存放集區時,Azure 容器儲存體會代表您建立儲存類別,並使用命名慣例 acstor-<storage-pool-name>

3.顯示可用的儲存類別

當存放集區準備好使用時,您必須選取儲存類別,以定義在建立及部署磁碟區時,如何動態建立儲存體。

執行 kubectl get sc 以顯示可用的儲存類別。 您應看到名為 acstor-<storage-pool-name> 的儲存類別。

$ kubectl get sc | grep "^acstor-"
acstor-azuredisk-internal   disk.csi.azure.com               Retain          WaitForFirstConsumer   true                   65m
acstor-ephemeraldisk-nvme        containerstorage.csi.azure.com   Delete          WaitForFirstConsumer   true                   2m27s

重要

請勿使用標示為 [內部] 的儲存類別。 這是 Azure 容器儲存體運作所需的內部儲存類別。

4.建立永續性磁碟區宣告

永續性磁碟區宣告 (PVC) 可用來根據儲存體類別,動態佈建儲存體。 請遵循下列步驟,使用新的儲存類別建立 PVC。

  1. 使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如 code acstor-pvc.yaml

  2. 貼上下列程式碼並儲存檔案。 PVC name 值可以是您想要的任何值。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ephemeralpvc
      annotations:
        acstor.azure.com/accept-ephemeral-storage: "true"
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: acstor-ephemeraldisk-nvme # replace with the name of your storage class if different
      resources:
        requests:
          storage: 100Gi
    

    當您變更磁碟區的儲存大小時,請確定大小小於單一節點暫時性磁碟的可用容量。 請參閱檢查節點暫時性磁碟容量

  3. 套用 YAML 資訊清單檔以建立 PVC。

    kubectl apply -f acstor-pvc.yaml
    

    您應該會看到如下所示的輸出:

    persistentvolumeclaim/ephemeralpvc created
    

    您可以執行下列命令來驗證 PVC 狀態:

    kubectl describe pvc ephemeralpvc
    

建立 PVC 後,就可以由 Pod 使用。

5.部署 Pod 並連結永續性磁碟區

使用 Fio (彈性 I/O 測試器) 建立 Pod,以進行基準測試和工作負載模擬,並指定永續性磁碟區的掛接路徑。 針對 claimName,請使用您在建立永續性磁碟區宣告時所使用的 name 值。

  1. 使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如 code acstor-pod.yaml

  2. 貼上下列程式碼並儲存檔案。

    kind: Pod
    apiVersion: v1
    metadata:
      name: fiopod
    spec:
      nodeSelector:
        acstor.azure.com/io-engine: acstor
      volumes:
        - name: ephemeralpv
          persistentVolumeClaim:
            claimName: ephemeralpvc
      containers:
        - name: fio
          image: nixery.dev/shell/fio
          args:
            - sleep
            - "1000000"
          volumeMounts:
            - mountPath: "/volume"
              name: ephemeralpv
    
  3. 套用 YAML 資訊清單檔以部署 Pod。

    kubectl apply -f acstor-pod.yaml
    

    您應該會看到如下輸出:

    pod/fiopod created
    
  4. 檢查 Pod 是否正在執行,且永續性磁碟區宣告已成功繫結至 Pod:

    kubectl describe pod fiopod
    kubectl describe pvc ephemeralpvc
    
  5. 檢查 Fio 測試以查看其目前狀態:

    kubectl exec -it fiopod -- fio --name=benchtest --size=800m --filename=/volume/test --direct=1 --rw=randrw --ioengine=libaio --bs=4k --iodepth=16 --numjobs=8 --time_based --runtime=60
    

您現在已部署使用具有磁碟區復寫本機 NVMe 的 Pod,並可用於 Kubernetes 工作負載。

管理磁碟區和存放集區

在本節中,您將了解如何檢查暫時性磁碟的可用容量、如何中斷連結和重新連結永續性磁碟區、如何展開或刪除存放集區,以及如何將效能最佳化。

檢查節點暫時性磁碟容量

暫時性磁碟區會配置在單一節點上。 當您設定暫時性磁碟區大小時,大小應該小於單一節點暫時性磁碟的可用容量。

執行下列命令來檢查單一節點的暫時性磁碟可用容量。

$ kubectl get diskpool -n acstor
NAME                                CAPACITY      AVAILABLE     USED        RESERVED    READY   AGE
ephemeraldisk-nvme-diskpool-jaxwb   75660001280   75031990272   628011008   560902144   True    21h
ephemeraldisk-nvme-diskpool-wzixx   75660001280   75031990272   628011008   560902144   True    21h
ephemeraldisk-nvme-diskpool-xbtlj   75660001280   75031990272   628011008   560902144   True    21h

在此範例中,單一節點的暫時性磁碟可用容量為 75031990272 位元組或 69 GiB。

中斷連結及重新連結永續性磁碟區

若要中斷連結永續性磁碟區,請刪除永續性磁碟區連結的 Pod。

kubectl delete pods <pod-name>

若要重新連結永續性磁碟區,只要參考 YAML 資訊清單檔中的永續性磁碟區宣告名稱,如部署 Pod 並連結永續性磁碟區中所述。

若要檢查永續性磁碟區宣告繫結至哪個永續性磁碟區,請執行:

kubectl get pvc <persistent-volume-claim-name>

擴充存放集區

您可以擴充本機 NVMe 支援的存放集區,以快速且不停機地相應增加。 目前不支援壓縮存放集區。

由於暫時性磁碟所支援的存放集區會使用 AKS 叢集節點 (VM) 上的本機存放區資源,因此擴充存放集區需要將另一個節點新增至叢集。 請依照這些指示擴充存放集區。

  1. 執行下列命令,以將節點新增至 AKS 叢集。 將 <cluster-name><nodepool name><resource-group-name> 取代為您自己的值。 若要取得節點集區的名稱,請執行 kubectl get nodes

    az aks nodepool add --cluster-name <cluster name> --name <nodepool name> --resource-group <resource group> --node-vm-size Standard_L8s_v3 --node-count 1 --labels acstor.azure.com/io-engine=acstor
    
  2. 執行 kubectl get nodes,您就會看到節點已新增至叢集。

  3. 執行 kubectl get sp -A,您應該會看到存放集區的容量已增加。

刪除存放集區

若要刪除存放集區,請執行下列命令。 使用存放集區名稱取代 <storage-pool-name>

kubectl delete sp -n acstor <storage-pool-name>

使用本機 NVMe 時將效能最佳化

視工作負載的效能需求而定,您可以從三個不同的效能層級中進行選擇:基本標準進階。 這三個層級提供不同的 IOPS 範圍,而您的選擇將會影響 Azure 容器儲存體元件在安裝所在節點中取用的 vCPU 數目。 如果您未更新效能層級,則預設設定是「標準」。

vCPU 數目
Basic VM 核心總數的 12.5%
Standard (預設值) 總計的 25%
Premium VM 核心總數的 50%

注意

RAM 和 Hugepage 使用量會在所有層級保持一致:1 GiB 的 RAM 和 2 GiB 的 Hugepage。

在識別出最符合需求的效能層級後,您可以執行下列命令來更新 Azure 容器儲存體安裝的效能層級。 將 <performance tier> 取代為基本、標準或進階。

az aks update -n <cluster-name> -g <resource-group> --enable-azure-container-storage <storage-pool-type> --ephemeral-disk-nvme-perf-tier <performance-tier>

另請參閱