使用本機 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 類型
本機 NVMe 磁碟僅適用於特定類型的 VM,例如 記憶體優化 VM SKU 或 GPU 加速的 VM SKU。 如果您打算使用本機 NVMe 容量,請選擇下列其中一個 VM SKU。
執行下列命令,以取得與節點集區搭配使用的 VM 類型。 將<resource group>
和 <cluster name>
取代為您自己的值。 您不需要提供 PoolName
或 VmSize
的值,因此請保留此處所示的查詢。
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 create
或 az aks update
命令來啟用 Azure 容器儲存體,您可能已有存放集區。 使用 kubectl get sp -n acstor
來取得存放集區的清單。 如果您有要使用的存放集區,可以跳過本節,然後從顯示可用的儲存類別繼續。
請按照以下步驟來建立使用本機 NVMe 的存放集區。
使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如
code acstor-storagepool.yaml
。貼上下列程式碼並儲存檔案。 存放集區 name 值可以是您想要的任何值。
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: ephemeraldisk-nvme namespace: acstor spec: poolType: ephemeralDisk: diskType: nvme
套用 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,以使用一般暫時性磁碟區進行基準測試和工作負載模擬。
使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如
code acstor-pod.yaml
。貼上下列程式碼並儲存檔案。
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
當您變更磁碟區的儲存大小時,請確定大小小於單一節點暫時性磁碟的可用容量。 請參閱檢查節點暫時性磁碟容量。
套用 YAML 資訊清單檔以部署 Pod。
kubectl apply -f acstor-pod.yaml
您應該會看到如下輸出:
pod/fiopod created
檢查 Pod 是否正在執行,且暫時性磁碟區宣告已成功繫結至 Pod:
kubectl describe pod fiopod kubectl describe pvc fiopod-ephemeralvolume
檢查 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.建立存放集區
透過在 YAML 資訊清單檔中定義存放集區來建立存放集區,這是 Kubernetes 叢集的儲存體邏輯分組。
如果您使用 az aks create
或 az aks update
命令來啟用 Azure 容器儲存體,您可能已有存放集區。 使用 kubectl get sp -n acstor
來取得存放集區的清單。 如果您有要使用的存放集區,可以跳過本節,然後從顯示可用的儲存類別繼續。
請按照以下步驟來建立使用本機 NVMe 的存放集區。
使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如
code acstor-storagepool.yaml
。貼上下列程式碼並儲存檔案。 存放集區 name 值可以是您想要的任何值。
apiVersion: containerstorage.azure.com/v1 kind: StoragePool metadata: name: ephemeraldisk-nvme namespace: acstor spec: poolType: ephemeralDisk: diskType: nvme
套用 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。
使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如
code acstor-pvc.yaml
。貼上下列程式碼並儲存檔案。 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
當您變更磁碟區的儲存大小時,請確定大小小於單一節點暫時性磁碟的可用容量。 請參閱檢查節點暫時性磁碟容量。
套用 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 值。
使用您慣用的文字編輯器來建立 YAML 資訊清單檔,例如
code acstor-pod.yaml
。貼上下列程式碼並儲存檔案。
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
套用 YAML 資訊清單檔以部署 Pod。
kubectl apply -f acstor-pod.yaml
您應該會看到如下輸出:
pod/fiopod created
檢查 Pod 是否正在執行,且永續性磁碟區宣告已成功繫結至 Pod:
kubectl describe pod fiopod kubectl describe pvc ephemeralpvc
檢查 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。
擴充存放集區
您可以擴充本機 NVMe 支援的存放集區,以快速且不停機地相應增加。 目前不支援壓縮存放集區。
由於暫時性磁碟所支援的存放集區會使用 AKS 叢集節點 (VM) 上的本機存放區資源,因此擴充存放集區需要將另一個節點新增至叢集。 請依照這些指示擴充存放集區。
執行下列命令,以將節點新增至 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
執行
kubectl get nodes
,您就會看到節點已新增至叢集。執行
kubectl get sp -A
,您應該會看到存放集區的容量已增加。
刪除存放集區
若要刪除存放集區,請執行下列命令。 使用存放集區名稱取代 <storage-pool-name>
。
kubectl delete sp -n acstor <storage-pool-name>
使用本機 NVMe 時將效能最佳化
視工作負載的效能需求而定,您可以從三個不同的效能層級中進行選擇:基本、標準和進階。 您的選擇將會影響 Azure 容器儲存體元件在安裝所在節點中取用的 vCPU 數目。 如果您未更新效能層級,則預設設定是「標準」。
這三個層級提供不同的 IOPS 範圍。 下表包含您預期每一層的指導方針。 我們使用 FIO,這是熱門的基準檢驗工具,透過下列組態來達成這些數字:
- AKS: Node SKU - Standard_L16s_v3;
- FIO:區塊大小 - 4KB;佇列深度 - 32;Numjobs - 指派給容器儲存體元件的核心數目;存取模式 - 隨機;背景工作角色集大小 - 32G
層 | vCPU 數目 | 100 % 讀取 IOPS | 100 % 寫入 IOPS |
---|---|---|---|
Basic |
VM 核心總數的 12.5% | 最多 120,000 | 最高 90,000 |
Standard (預設值) |
VM 核心總數的 25% | 最多 220,000 | 最高 180,000 |
Premium |
VM 核心總數的 50% | 最多550,000 | 最高 360,000 |
注意
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>