🎼

AKS で Virtual Machines ノードプールを試す

に公開

はじめに

AKS の新しい機能 Virtual Machines ノードプール がリリースされました。

これにより、従来の VMSS (Virtual Machine Scale Sets) ベースのノードプールでは難しかった、同一ファミリー内で異なるサイズの VM を混在させる柔軟性や、ノード単位での細やかな制御が実現できます。

従来の VMSS ノードプールとの違い

  • VM ノードプール:AKS が“各ノード個別”のプロビジョニングとブートストラップを直接管理。ScaleProfile という概念で、複数の VM サイズ(同一ファミリー内に限る)を 1 つのノードプールにまとめられます。([Microsoft Learn][1])
  • VMSS ノードプール:AKS は VMSS の“モデル”を管理し、同一 SKU のノードを大量に複製して整合性を保つアプローチ。SKU を変えたい場合は新しいノードプールを作る必要がありました。([Microsoft Learn][1])

注意点・制約

VM ノードプールには、記事執筆時点でいくつかの制約があります。

  • Cluster Autoscaler に非対応
  • Azure Portal からの構成は不可。CLI または REST での構成が必要
  • ノードプールのスナップショットには非対応
  • 混在できる VM サイズは "同一ファミリー内のみ/最大5種類まで"
  • Kubernetes v1.27 以上

試してみた!

環境

  • WSL Ubuntu 22.04
  • Azure CLI 2.75

変数定義&リソースグループの作成

rg=rg-aks-vmnp-demo
location=japaneast
cluster=aks-vmnp-demo-cl
az group create -n $rg -l $location

VM ノードプールを使った AKS クラスターの新規作成

--vm-set-type "VirtualMachines"--vm-sizes を指定して AKS クラスターを作成します。

az aks create \
  --resource-group $rg \
  --name $cluster \
  --vm-set-type "VirtualMachines" \
  --vm-sizes "Standard_D4s_v3" \
  --node-count 1 \
  --kubernetes-version 1.30.12 \
  --load-balancer-sku standard \
  --generate-ssh-keys

Manual Scale Profile を追加・更新・削除してみる

VM ノードプールは Manual Scale Profile で SKU と台数を管理します。CLI で設定し、現状では Azure Portal からは操作できないことに注意です。

作成済みのものとは異なる SKU Standard_D2s_v3 のノードを追加してみます。

az aks nodepool manual-scale add \
  --resource-group $rg \
  --cluster-name $cluster \
  --name nodepool1 \
  --vm-sizes "Standard_D2s_v3" \
  --node-count 2

追加されたノードについて kubectl describe node を見てみると、instance-typeStandard_D2s_v3 となっていることも確認できます。

kubectl describe node aks-nodepool1-29907444-vms5
...
                    node.kubernetes.io/instance-type=Standard_D2s_v3
...

Workload を特定 SKU にスケジューリングする

混在させた VM サイズごとにワークロードを分けるには、nodeSelectornodeAffinity を使います。下記は Standard_D4s_v3 に載せたい Deployment 例です。

example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: heavy-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: heavy-app
  template:
    metadata:
      labels:
        app: heavy-app
    spec:
      nodeSelector:
        node.kubernetes.io/instance-type: Standard_D4s_v3
      containers:
      - name: heavy-app
        image: nginx
        resources:
          requests:
            cpu: "2"
            memory: "4Gi"

デプロイしてみると、無事 Standard_D4s_v3 のノードにデプロイされていることが分かります。

kubectl apply -f example.yaml
kubectl get pods -o wide
...
NAME                         READY   STATUS    RESTARTS   AGE   IP             NODE                          NOMINATED NODE   READINESS GATES
heavy-app-6c4cb48b87-hpb8t   1/1     Running   0          71s   xx.xxx.x.xxx   aks-nodepool1-29907444-vms4   <none>           <none>
...

kubectl describe node aks-nodepool1-29907444-vms4
...
                    node.kubernetes.io/instance-type=Standard_D4s_v3
...

おわりに

ということで AKS での Virtual Machines ノードプールを試してみました。

AKS のリリースノートでも今後はこちらがデフォルトになっていく予定だそうなので、試しておけると良いですね!

Discussion