在 Azure Kubernetes 服务上使用 Azure 高级 SSD v2 磁盘

Azure 高级 SSD v2 磁盘提供 IO 密集型企业工作负载、一致的亚毫秒级磁盘延迟以及高 IOPS 和吞吐量。 可随时独立配置 Premium SSD v2 磁盘的性能(容量、吞吐量和 IOPS),从而轻松地让更多方案在满足性能需求的同时实现高性价比。

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

准备阶段

在创建或升级能够使用 Azure 高级 SSD v2 磁盘的 AKS 群集之前,需要在支持高级存储的同一区域和可用性区域中创建 AKS 群集,并按照以下步骤附加磁盘。

对于现有的 AKS 群集,可以通过向群集添加新节点池来启用高级 SSD v2 磁盘,然后按照以下步骤附加磁盘。

重要

Azure 高级 SSD v2 磁盘要求在支持这些磁盘的区域部署节点池。 有关支持区域的列表,请参阅高级 SSD v2 磁盘支持的区域

限制

  • Azure 高级 SSD v2 磁盘有一些需要注意的限制。 有关完整列表,请参阅高级 SSD v2 限制

通过存储类动态使用高级 SSD v2 磁盘

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

创建存储类

存储类用于定义使用永久性卷动态创建存储单位的方式。 有关 Kubernetes 存储类的详细信息,请参阅 Kubernetes 存储类

在此示例中,你要创建引用高级 SSD v2 磁盘的存储类。 创建名为 azure-pv2-disk-sc.yaml 的文件,并将其复制到以下清单中。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: premium2-disk-sc
parameters:
   cachingMode: None
   skuName: PremiumV2_LRS
   DiskIOPSReadWrite: "4000"
   DiskMBpsReadWrite: "1000"
provisioner: disk.csi.azure.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

使用 kubectl apply 命令创建存储类,并指定 azure-pv2-disk-sc.yaml 文件:

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

命令的输出如下例所示:

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

创建永久性卷声明

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

创建名为 azure-pv2-disk-pvc.yaml 的文件,并将其复制到以下清单中。 该声明请求名为 premium2-disk、大小为 1000 GB、具有 ReadWriteOnce 访问权限的磁盘 。 premium2-disk-sc 存储类指定为存储类。

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

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

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

命令的输出如下例所示:

persistentvolumeclaim/premium2-disk created

使用永久性卷

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

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

kind: Pod
apiVersion: v1
metadata:
  name: nginx-premium2
spec:
  containers:
  - name: nginx-premium2
    image: mcr.azk8s.cn/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: premium2-disk

使用 kubectl apply 命令创建 Pod,如以下示例所示:

kubectl apply -f nginx-premium2.yaml

命令的输出如下例所示:

pod/nginx-premium2 created

现在你有一个正在运行的 Pod,其中 Azure 磁盘被装载到 /mnt/azure 目录中。 通过 kubectl describe pod nginx-premium2 检查 Pod 时可以看到此配置,如以下精简示例所示:

kubectl describe pod nginx-premium2

[...]
Volumes:
  volume:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  premium2-disk
    ReadOnly:   false
  kube-api-access-sh59b:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   Burstable
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/memory-pressure:NoSchedule op=Exists
                             node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason                  Age    From                     Message
  ---- ------                  ---- ----                     -------
  Normal  Scheduled               7m58s  default-scheduler        Successfully assigned default/nginx-premium2 to aks-agentpool-12254644-vmss000006
  Normal  SuccessfulAttachVolume  7m46s  attachdetach-controller  AttachVolume.Attach succeeded for volume "pvc-ff39fb64-1189-4c52-9a24-e065b855b886"
  Normal  Pulling                 7m39s  kubelet                  Pulling image "mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine"
  Normal  Pulled                  7m38s  kubelet                  Successfully pulled image "mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine" in 1.192915667s
  Normal  Created                 7m38s  kubelet                  Created container nginx-premium2
  Normal  Started                 7m38s  kubelet                  Started container nginx-premium2
[...]

设置 IOPS 和吞吐量限制

AKS 目前不支持 Azure 高级 v2 SSD 磁盘的每秒输入/输出操作 (IOPS) 和吞吐量限制。 若要调整性能,可以使用 Azure CLI 命令 az disk update 并加入 --disk-iops-read-write--disk-mbps-read-write 参数。

以下示例将磁盘 IOPS 读/写更新为 5000,将 Mbps 更新为 200。 对于 --resource-group,该值必须是自动创建的第二个资源组,用于存储具有命名约定 MC_resourcegroupname_clustername_location 的 AKS 工作器节点。 有关详细信息,请参阅为何使用 AKS 创建两个资源组?

--name 参数的值是使用 StorageClass 创建的卷的名称,它以 pvc- 开头。 若要标识磁盘名称,可以在门户中运行 kubectl get pvc 或导航到辅助资源组来查找它。 有关详细信息,请参阅从 Azure 门户管理资源

az disk update --subscription subscriptionName --resource-group myResourceGroup --name diskName --disk-iops-read-write=5000 --disk-mbps-read-write=200  

后续步骤