Azure Kubernetes Service で Azure Premium SSD v2 ディスクを使用する

Azure Premium SSD v2 ディスクは、IO の負荷の高いエンタープライズ ワークロード、ミリ秒未満の安定したディスク待機時間、高い IOPS とスループットを実現します。 Premium SSD v2 ディスクのパフォーマンス (容量、スループット、IOPS) は、いつでも個別に構成できるため、多くのシナリオで、パフォーマンスのニーズを満たしながら、高いコスト効率の実現が容易になります。

この記事では、Azure Premium SSD v2 ディスクを使用するように新規または既存の AKS クラスターを構成する方法について説明します。

開始する前に

Azure Premium SSD v2 ディスクを使用できる AKS クラスターを作成またはアップグレードする前に、Premium Storage をサポートする同じリージョンと可用性ゾーンに AKS クラスターを作成し、次の手順に従ってディスクを接続する必要があります。

既存の AKS クラスターの場合、新しいノード プールをクラスターに追加して Premium SSD v2 ディスクを有効にしてから、次の手順に従ってディスクを接続できます。

重要

Azure Premium SSD v2 ディスクには、これらのディスクをサポートするリージョンにデプロイされたノード プールが必要です。 サポートされているリージョンの一覧については、Premium SSD v2 ディスクでサポートされているリージョンに関するページを参照してください。

制限事項

  • Azure Premium SSD v2 ディスクには、注意が必要ないくつかの制限事項があります。 完全な一覧については、「Premium SSD v2 の制限事項」を参照してください。

ストレージ クラスで Premium SSD v2 ディスクを動的に使用する

デプロイまたはステートフル セットで Premium SSD v2 ディスクを使用するには、動的プロビジョニングにストレージ クラスを使用できます。

ストレージ クラスの作成

ストレージ クラスは、保存の単位を永続ボリュームを使用して動的に作成する方法を定義します。 Kubernetes ストレージ クラスについて詳しくは、Kubernetes ストレージ クラスに関するページをご覧ください。

次の例では、Premium 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 は以前に作成したストレージ クラスを使用して、Ultra Disks を作成できます。

azure-pv2-disk-pvc.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。 クレームでは、サイズが 1000 GBReadWriteOnce アクセスがある premium2-disk という名前のディスクを要求します。 ストレージ クラスとして、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

永続ボリュームの使用

永続ボリューム要求が作成され、ディスクが正常にプロビジョニングされると、ディスクへのアクセスを使ってポッドを作成できます。 次のマニフェストは、premium2-disk という名前の永続ボリューム要求を使って /mnt/azure パスに Azure ディスクをマウントする基本的な NGINX ポッドを作成します。

nginx-premium2.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。

kind: Pod
apiVersion: v1
metadata:
  name: nginx-premium2
spec:
  containers:
  - name: nginx-premium2
    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: premium2-disk

次の例に示すように kubectl apply コマンドを使用してポッドを作成します。

kubectl apply -f nginx-premium2.yaml

コマンドの出力は、次の例のようになります。

pod/nginx-premium2 created

これで Azure ディスクが /mnt/azure ディレクトリにマウントされ、ポッドが稼働状態となりました。 次の例に示すように、kubectl describe pod nginx-premium2 でポッドを検査するときに、この構成を確認できます。

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.microsoft.com/oss/nginx/nginx:1.15.5-alpine"
  Normal  Pulled                  7m38s  kubelet                  Successfully pulled image "mcr.microsoft.com/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 とスループットの制限を設定する

Azure Premium v2 SSD ディスクの 1 秒あたりの入出力操作 (IOPS) とスループットの制限は、現在、AKS ではサポートされていません。 パフォーマンスを調整するには、--disk-iops-read-write パラメーターと --disk-mbps-read-write パラメーターを指定した Azure CLI コマンド az disk update を使用できます。

次の例では、ディスク IOPS の読み取り/書き込みを 5000 に、Mbps を 200 に更新します。 --resource-group の場合、値は、名前付け規則 MC_resourcegroupname_clustername_location を使用して AKS ワーカー ノードを格納するために自動的に作成される 2 番目のリソース グループである必要があります。 詳細については、「AKS と一緒にリソース グループが 2 つ作成されるのはなぜでしょうか?」を参照してください。

--name パラメーターの値は、StorageClass を使用して作成されたボリュームの名前であり、pvc- で始まります。 ディスク名を識別するには、kubectl get pvc を実行するか、ポータルでセカンダリ リソース グループに移動して見つけることができます。 詳細については、Azure portal からリソースを管理するに関するページを参照してください。

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

次の手順