在 Azure Kubernetes Service (AKS) 中建立和使用 Azure 磁碟儲存體的磁碟區

永續性磁碟區代表一塊與 Kubernetes Pod 搭配使用的儲存體。 您可以將一或多個 Pod 搭配使用永續性磁碟區使用,並且您能以動態或靜態方式佈建。 本文示範如何在 Azure Kubernetes Service (AKS) 叢集內搭配 Azure 資料箱磁碟動態建立永續性磁碟區。

注意

您只能使用存取模式類型 ReadWriteOnce 來掛接 Azure 磁碟,以讓它僅供 AKS 中一個節點使用。 當 Pod 在相同節點上執行時,此存取模式仍允許多個 Pod 存取磁碟區。 如需詳細資訊,請參閱 Kubernetes 永續性磁碟區 存取模式。

本文章說明如何:

  • 透過安裝容器儲存體介面 (CSI) 驅動程式,並動態建立一或多個 Azure 受控磁碟來連結至 Pod,以使用動態永續性磁碟區 (PV)。
  • 透過建立一或多個 Azure 受控磁碟或使用現有的檔案共用並將其連結至 Pod,以使用靜態 PV。

如需 Kubernetes 磁碟區的詳細資訊,請參閱 AKS 中的應用程式適用的儲存體選項

開始之前

  • 確定您已安裝並設定 Azure CLI 2.0.59 版或更新版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI

  • Azure 資料箱磁碟 CSI 驅動程式每個節點的磁碟區具有限制。 磁碟區計數會根據節點/節點集區的大小而變更。 執行kubectl get命令來判斷每個節點可配置的磁碟數目:

    kubectl get CSINode <nodename> -o yaml
    

動態佈建磁碟區

本節可為想要佈建一或多個永續性磁碟區的叢集系統管理員提供指導,這些磁碟區中包含 Azure 資料箱磁碟儲存體上工作負載使用的詳細資料。 永續性磁碟區宣告 (PVC) 會使用儲存體類別物件,以動態方式佈建 Azure 資料箱磁碟儲存體容器。

動態 PersistentVolumes 的 儲存體 類別參數

下表包含可用來為 PersistentVolumeClaim 定義自定義儲存類別的參數。

名稱 意義 可用的值 必要 預設值
skuName Azure 磁碟的儲存體帳戶類型 (別名:storageAccountType) Standard_LRSPremium_LRS、、PremiumV2_LRSStandardSSD_LRSUltraSSD_LRS、、、 Premium_ZRSStandardSSD_ZRS No StandardSSD_LRS
fsType 檔案系統類型 Linux 為 ext4ext3ext2xfsbtrfs,Windows 為 ntfs No Linux 為 ext4,Windows 為 ntfs
cachingMode Azure 資料磁碟主機快取設定 None、 、 ReadOnlyReadWrite No ReadOnly
resourceGroup 指定 Azure 資料箱磁碟的資源群組 現有的資源群組名稱 No 若空白,驅動程式會使用與目前 AKS 叢集相同的資源群組名稱
DiskIOPSReadWrite UltraSSD 磁碟進階版 SSD v2 IOPS 功能(最小值:2 IOPS/GiB) 100~160000 No 500
DiskMBpsReadWrite UltraSSD 磁碟進階版 SSD v2 輸送量功能(最小值:0.032/GiB) 1~2000 No 100
LogicalSectorSize Ultra 磁碟的邏輯磁區大小 (位元組)。 支援的值為 512 和 4096。 預設為 4096。 512, 4096 No 4096
標記 Azure 磁碟標籤 標籤格式:key1=val1,key2=val2 No ""
diskEncryptionSetID 用來啟用待用加密的磁碟加密集 ResourceId 格式:/subscriptions/{subs-id}/resourceGroups/{rg-name}/providers/Microsoft.Compute/diskEncryptionSets/{diskEncryptionSet-name} No ""
diskEncryptionType 磁碟加密集的加密類型。 EncryptionAtRestWithCustomerKey(預設)、EncryptionAtRestWithPlatformAndCustomerKeys No ""
writeAcceleratorEnabled Azure 磁碟上的寫入加速器 true, false No ""
networkAccessPolicy NetworkAccessPolicy 屬性可防止任何人產生磁碟或快照集的 SAS URI AllowAll、 、 DenyAllAllowPrivate No AllowAll
diskAccessID 可在磁碟上使用私人端點的 DiskAccess 資源 Azure 資源識別碼 No ``
enableBursting 啟用隨需高載超越已佈建的磁碟效能目標。 隨需高載應只能套用至進階磁碟且磁碟大小大於 512 GB 時。 不支援 Ultra 和共用磁碟。 磁碟高載預設為停用。 true, false No false
userAgent 用於客戶使用狀況屬性的使用者代理程式 No 產生的使用者代理程式格式為 driverName/driverVersion compiler/version (OS-ARCH)
subscriptionID 指定於其中建立 Azure 磁碟的 Azure 訂用帳戶識別碼。 Azure 訂用帳戶識別碼 No 若非空白,必須提供 resourceGroup
--- 下列參數僅適用於 v2 --- --- ---
maxShares 磁碟允許的共用磁碟掛接總數。 將值設定為 2 或更多可啟用附加複本。 支援的值取決於磁碟大小。 如需支援的值,請參閱共用 Azure 受控磁碟 No 1
maxMountReplicaCount 要維護的複本附加數目。 這個值必須介於[0..(maxShares - 1)]的範圍內 No 如果accessModeReadWriteMany,則預設為0。 否則預設為 maxShares - 1

內建儲存類別

儲存類別定義如何搭配永續性磁碟區動態建立儲存體單位。 如需 Kubernetes 儲存類別的詳細資訊,請參閱 Kubernetes 儲存類別

每個 AKS 叢集都包含四個預先建立的儲存類別,而且其中兩個類別設定為可搭配 Azure 磁碟使用:

  1. default 儲存類別會佈建標準 SSD Azure 磁碟。
    • 標準 SSD 由標準儲存體支援,並提供符合成本效益的儲存體,同時仍提供可靠效能。
  2. managed-csi-premium 儲存體類別會佈建進階 Azure 磁碟。
    • 以 SSD 為基礎的高效能、低延遲磁碟的進階磁碟。 執行生產工作負載的 VM 的理想選擇。 當您在 AKS 上使用 Azure 磁碟 CSI 驅動程式時,也可以使用由標準 SSD 本地備援儲存體 (LRS) 支援的 managed-csi 儲存類別。

由於數據遺失的風險,不支援降低PVC的大小。 您可以使用 kubectl edit sc 命令來編輯現有的儲存類別,也可以建立自己的自定義儲存類別。 舉例來說,如果您想要使用大小為 4 TiB 的磁碟,必須建立定義 cachingmode: None 的儲存類別,因為 4 TiB 和更大磁碟不支援磁碟快取。 如需儲存類別和建立專屬儲存類別的詳細資訊,請參閱 AKS 中應用程式的儲存體選項 (機器翻譯)

您可以使用 kubectl get sc 命令來查看預先建立的儲存體類別。 以下範例顯示 AKS 叢集中可用的預先建立儲存體類別:

kubectl get sc

此命令的輸出與下列範例類似:

NAME                PROVISIONER                AGE
default (default)   disk.csi.azure.com         1h
managed-csi         disk.csi.azure.com         1h

注意

GiB 中會指定持續性磁碟區宣告,但 SKU 會針對特定的大小向 Azure 受控磁碟收費。 這些 SKU 範圍從 S4 或 P4 磁碟的 32 GiB 到 S80 或 P80 磁碟的 32 TiB (預覽)。 進階受控磁碟的輸送量和 IOPS 效能,取決於 SKU 和 AKS 叢集中節點的執行個體大小。 如需詳細資訊,請參閱受控磁碟的定價和效能

建立永續性磁碟區宣告

永續性磁碟區宣告 (PVC) 會根據儲存體類別,動態佈建儲存體。 在此情況下,PVC 可以使用其中一個預先建立的儲存體類別,來建立標準或進階 Azure 受控磁碟。

  1. 建立名為 azure-pvc.yaml 的檔案,然後將下列資訊清單複製進來。 宣告要求名為 azure-managed-disk 的磁碟,其大小為 5 GB 且具備 ReadWriteOnce 存取權。 系統會將儲存體類別指定為 managed-csi 儲存體類別。

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

提示

若要建立使用進階儲存體的磁碟,請使用 storageClassName: managed-csi-premium 而非 managed-csi

  1. 使用 kubectl apply 命令來建立永續性磁碟區宣告,並指定您的 azure-premium.yaml 檔案。

    kubectl apply -f azure-pvc.yaml
    

    此命令的輸出與下列範例類似:

    persistentvolumeclaim/azure-managed-disk created
    

使用永續性磁碟區

建立永續性磁碟區宣告之後,您必須確認它的狀態為 Pending。 狀態 Pending 表示已準備好供 Pod 使用。

  1. 使用 kubectl describe pvc 命令確認 PVC 的狀態。

    kubectl describe pvc azure-managed-disk
    

    此命令的輸出與下列縮寫範例類似:

    Name:            azure-managed-disk
    Namespace:       default
    StorageClass:    managed-csi
    Status:          Pending
    [...]
    
  2. 建立名為 azure-pvc-disk.yaml 的檔案,然後將下列資訊清單複製進來。 此資訊清單所建立的基本 NGINX Pod,會使用名為 azure-managed-disk 的永續性磁碟區宣告,在 /mnt/azure 路徑上掛接 Azure 資料箱磁碟。 對於 Windows Server 容器,請採用 Windows 路徑慣例來指定 mountPath,例如 'D:'

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod
          image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          volumeMounts:
            - mountPath: "/mnt/azure"
              name: volume
              readOnly: false
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: azure-managed-disk
    
  3. 使用 kubectl apply 命令建立 Pod。

     kubectl apply -f azure-pvc-disk.yaml
    

    此命令的輸出與下列範例類似:

    pod/mypod created
    
  4. 您現在已有一個 Azure 磁碟掛接在 /mnt/azure 目錄中的執行中 Pod。 使用 kubectl describe 命令檢查 Pod 設定。

     kubectl describe pod mypod
    

    此命令的輸出與下列範例類似:

    [...]
    Volumes:
      volume:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  azure-managed-disk
        ReadOnly:   false
       default-token-smm2n:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-smm2n
        Optional:    false
    [...]
     Events:
      Type    Reason                 Age   From                               Message
      ----    ------                 ----  ----                               -------
      Normal  Scheduled              2m    default-scheduler                  Successfully assigned mypod to aks-nodepool1-79590246-0
      Normal  SuccessfulMountVolume  2m    kubelet, aks-nodepool1-79590246-0  MountVolume.SetUp succeeded for volume "default-token-smm2n"
      Normal  SuccessfulMountVolume  1m    kubelet, aks-nodepool1-79590246-0  MountVolume.SetUp succeeded for volume "pvc-faf0f176-8b8d-11e8-923b-deb28c58d242"
    [...]
    

使用 Azure Ultra 磁碟

若要使用 Azure Ultra 磁碟,請參閱在 Azure Kubernetes Service (AKS) 上使用 Ultra 磁碟

使用 Azure 標籤

如需使用 Azure 標籤的詳細資訊,請參閱在 Azure Kubernetes Service (AKS) 中使用 Azure 標籤

靜態佈建磁碟區

本節提供叢集系統管理員的指引,這些系統管理員想要建立一或多個永續性磁碟區,其中包含可供工作負載使用的 Azure 磁碟詳細數據。

永續性磁碟區的靜態布建參數

下表包含可用來定義永續性磁碟區的參數。

名稱 意義 可用的值 必要 預設值
volumeHandle Azure 磁碟 URI /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id} Yes N/A
volumeAttributes.fsType 檔案系統類型 Linux 為 ext4ext3ext2xfsbtrfs,Windows 為 ntfs No Linux 為 ext4,Windows 為 ntfs
volumeAttributes.partition 現有磁碟的分割區編號 (僅 Linux 上支援) 1、 、 23 No 空白 (無分割區)
- 請確定分割區格式類似 -part1
volumeAttributes.cachingMode 磁碟主機快取設定 None、 、 ReadOnlyReadWrite No ReadOnly

建立 Azure 磁碟

當您建立與 AKS 搭配使用的 Azure 磁碟時,您可以在節點資源群組中建立磁碟資源。 此方法可讓 AKS 叢集存取和管理磁碟資源。 如果您在個別的資源群組中建立磁碟,則必須將磁碟資源群組的 Contributor 角色授與叢集的 Azure Kubernetes Service (AKS) 受控識別。

  1. 使用 az aks show 命令來識別資源群組名稱,並新增 --query nodeResourceGroup 參數。

    az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    

    此命令的輸出與下列範例類似:

    MC_myResourceGroup_myAKSCluster_eastus
    
  2. 使用 az disk create 命令建立磁碟。 指定節點資源群組名稱,然後指定磁碟資源的名稱,例如 myAKSDisk。 下列範例會建立 20GiB 的磁碟,並在建好後輸出磁碟識別碼。 如果您需要建立磁碟以搭配 Windows 伺服器容器使用,請新增 --os-type windows 參數以正確格式化磁碟。

    az disk create \
      --resource-group MC_myResourceGroup_myAKSCluster_eastus \
      --name myAKSDisk \
      --size-gb 20 \
      --query id --output tsv
    

    注意

    Azure 資料箱磁碟是按 SKU 的特定大小計費。 這些 SKU 範圍從 S4 或 P4 磁碟的 32 GiB 到 S80 或 P80 磁碟的 32 TiB (預覽)。 進階受控磁碟的輸送量和 IOPS 效能,取決於 SKU 和 AKS 叢集中節點的執行個體大小。 請參閱受控磁碟的定價和效能

    當命令成功完成之後,磁碟資源識別碼就會隨即顯示,如下列輸出範例所示。 在下一個區段中,使用磁碟識別碼來掛接磁碟。

    /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
    

將磁碟掛接為磁碟區

  1. 建立具有 PersistentVolumepv-azuredisk.yaml 檔案。 使用上一個步驟的磁碟資源識別碼更新 volumeHandle。 針對 Windows Server 容器,指定參數 fsType 的 ntfs

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: disk.csi.azure.com
      name: pv-azuredisk
    spec:
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: managed-csi
      csi:
        driver: disk.csi.azure.com
        volumeHandle: /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
        volumeAttributes:
          fsType: ext4
    
  2. 建立 pvc-azuredisk.yaml 檔案,其具有使用 PersistentVolumePersistentVolumeClaim

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-azuredisk
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      volumeName: pv-azuredisk
      storageClassName: managed-csi
    
  3. 使用kubectl apply命令並參考已建立的兩個 YAML 檔案來建立PersistentVolumePersistentVolumeClaim

    kubectl apply -f pv-azuredisk.yaml
    kubectl apply -f pvc-azuredisk.yaml
    
  4. 使用 kubectl get pvc 命令,驗證 PersistentVolumeClaim 已建立完成並繫結至 PersistentVolume

    kubectl get pvc pvc-azuredisk
    

    此命令的輸出與下列範例類似:

    NAME            STATUS   VOLUME         CAPACITY    ACCESS MODES   STORAGECLASS   AGE
    pvc-azuredisk   Bound    pv-azuredisk   20Gi        RWO                           5s
    
  5. 建立 azure-disk-pod.yaml 檔案,以參考您的 PersistentVolumeClaim。 對於 Windows Server 容器,請採用 Windows 路徑慣例來指定 mountPath,例如 'D:'

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
        name: mypod
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        volumeMounts:
          - name: azure
            mountPath: /mnt/azure
      volumes:
        - name: azure
          persistentVolumeClaim:
            claimName: pvc-azuredisk
    
  6. 使用 kubectl apply 命令套用設定並掛接磁碟區。

    kubectl apply -f azure-disk-pod.yaml
    

清除資源

當您完成本文中建立的資源時,您可以使用 kubectl delete 命令將其移除。

# Remove the pod
kubectl delete -f azure-pvc-disk.yaml

# Remove the persistent volume claim
kubectl delete -f azure-pvc.yaml

下一步