你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Kubernetes 服务上使用 Azure 超级磁盘

Azure 超级磁盘为有状态应用程序提供高吞吐量、高 IOPS 和一致且低延迟的磁盘存储。 超级磁盘的一个主要优点是能够动态更改 SSD 的性能和工作负载,而无需重启代理节点。 超级磁盘适用于数据密集型工作负载。

本文介绍如何配置新的或现有的 AKS 群集以使用 Azure 超级磁盘。

准备阶段

只能在创建群集或创建节点池时设置此功能。

限制

  • 如果要使用 Azure 超级磁盘,需要在支持此类磁盘的可用性区域和其他区域中部署节点池,并且只有特定的 VM 系列支持此类磁盘。 有关详细信息,请查看超级磁盘限制部分下的相应表。
  • 超级磁盘不能与某些特性和功能一起使用,例如可用性集或 Azure 磁盘加密。 有关最新信息,请查看超级磁盘限制

创建可以使用超级磁盘的群集

使用以下 CLI 命令创建能够利用 Azure 超级磁盘的 AKS 群集。 使用 --enable-ultra-ssd 参数设置 EnableUltraSSD 功能。

az aks create \
    --resource-group MyResourceGroup \
    --name myAKSCluster \
    --location westus2 \
    --node-vm-size Standard_D2s_v3 \
    --zones 1 2 \
    --node-count 2 \
    --enable-ultra-ssd \
    --generate-ssh-keys

如果要创建不支持超级磁盘的群集,可以省略 --enable-ultra-ssd 参数。

在现有群集上启用超级磁盘

可以通过将新的节点池添加到支持超级磁盘的群集上,在现有群集上启用超级磁盘。 使用 --enable-ultra-ssd 参数和 az aks nodepool add 命令将新的节点池配置为使用超级磁盘。

如果要创建不支持超级磁盘的新节点池,可以排除 --enable-ultra-ssd 参数。

通过存储类动态使用超级磁盘

若要在部署或 StatefulSet 中使用超级磁盘,可以使用存储类进行动态预配

创建存储类

存储类用于定义使用永久性卷动态创建存储单位的方式。 有关 Kubernetes 存储类的详细信息,请参阅 Kubernetes 存储类。 在此示例中,我们将创建一个引用超级磁盘的存储类。

  1. 创建名为 azure-ultra-disk-sc.yaml 的文件,并将以下清单复制到其中:

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: ultra-disk-sc
    provisioner: disk.csi.azure.com # replace with "kubernetes.io/azure-disk" if aks version is less than 1.21
    volumeBindingMode: WaitForFirstConsumer # optional, but recommended if you want to wait until the pod that will use this disk is created 
    parameters:
      skuname: UltraSSD_LRS
      kind: managed
      cachingMode: None
      diskIopsReadWrite: "2000"  # minimum value: 2 IOPS/GiB 
      diskMbpsReadWrite: "320"   # minimum value: 0.032/GiB
    
  2. 使用 kubectl apply 命令创建存储类,并指定 azure-ultra-disk-sc.yaml 文件。

    kubectl apply -f azure-ultra-disk-sc.yaml
    

    输出应与下面的示例输出类似:

    storageclass.storage.k8s.io/ultra-disk-sc created
    

创建永久性卷声明

永久卷声明 (PVC) 用于基于存储类自动预配存储。 在本例中,PVC 可以使用以前创建的存储类来创建超级磁盘。

  1. 创建名为 azure-ultra-disk-pvc.yaml 的文件,并将以下清单复制到其中:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ultra-disk
    spec:
      accessModes:
     - ReadWriteOnce
      storageClassName: ultra-disk-sc
      resources:
        requests:
          storage: 1000Gi
    

    该声明请求名为 ultra-disk、大小为 1000 GB、具有 ReadWriteOnce 访问权限的磁盘 。 ultra-disk-sc 存储类指定为存储类。

  2. 使用 kubectl apply 命令创建永久性卷声明,并指定 azure-ultra-disk-pvc.yaml 文件。

    kubectl apply -f azure-ultra-disk-pvc.yaml
    

    输出应与下面的示例输出类似:

    persistentvolumeclaim/ultra-disk created
    

使用永久性卷

创建永久性卷声明并成功预配磁盘以后,即可创建可以访问磁盘的 Pod。 以下清单创建的基本 NGINX Pod 使用名为 ultra-disk 的永久性卷声明将 Azure 磁盘装载到 /mnt/azure 路径。

  1. 创建名为 nginx-ultra.yaml 的文件,并将以下清单复制到其中:

    kind: Pod
    apiVersion: v1
    metadata:
      name: nginx-ultra
    spec:
      containers:
     - name: nginx-ultra
        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
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: ultra-disk
    
  2. 使用 kubectl apply 命令创建 Pod 并指定 nginx-ultra.yaml 文件。

    kubectl apply -f nginx-ultra.yaml
    

    输出应与下面的示例输出类似:

    pod/nginx-ultra created
    

    现在你有一个正在运行的 Pod,其中 Azure 磁盘被装载到 /mnt/azure 目录中。

  3. 使用 kubectl describe pod 命令查看配置详细信息并指定 nginx-ultra.yaml 文件。

    kubectl describe pod nginx-ultra
    

    输出应与下面的示例输出类似:

    [...]
    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"
    [...]
    

后续步骤