🎼
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-type が Standard_D2s_v3 となっていることも確認できます。
kubectl describe node aks-nodepool1-29907444-vms5
...
node.kubernetes.io/instance-type=Standard_D2s_v3
...
Workload を特定 SKU にスケジューリングする
混在させた VM サイズごとにワークロードを分けるには、nodeSelector や nodeAffinity を使います。下記は 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