演習 - AKS クラスターでクラスター自動スケーラーを使用してスポット ノード プールを構成する
スポット ユーザー ノード プールは、ハイパフォーマンス コンピューティング シナリオをサポートしながら、使われていない Azure コンピューティング容量に低価格でアクセスできます。
前の演習では、標準ユーザー ノード プールを作成し、クラスター自動スケーラーを使用してノードの作成を管理し、ノード数を手動でスケーリングしました。
次の手順では、自動スケーリングを使ってスポット ユーザー ノード プールを追加することで、クラスターの運用コストを削減します。 クラスターの使用量は必要なリソースによって異なり、予測できないため、スパイクとディップを捉える規則を設定します。 ノード アフィニティを有効にしてワークロードをデプロイし、スポット ノード プールのノードにポッドがスケジュールされるようにします。
スポット ノード プールを作成する
バッチ処理サービスをサポートする、独立したノード プールを作成する必要があります。 このノード プールは、"削除" の削除ポリシーと、-1 のスポット最大価格を使用するスポット ノード プールです。
前の演習と同じ
az aks nodepool add
コマンドを実行して、新しいスポット ノード プールをクラスターに追加します。 このノード プールをスポット ノード プールとして識別するには、ノード プール名を変更し、いくつかのパラメーターを追加する必要があります。以下の値を入力して、ノード プールのパラメーターを設定します。
- 名前:
batchprocpl2
- 優先度:
Spot
- 削除ポリシー:
Delete
- スポット最大価格:
-1
次のコマンドを実行してスポット ノード プールを作成します。
az aks nodepool add \ --resource-group $RESOURCE_GROUP \ --cluster-name $AKS_CLUSTER_NAME \ --name batchprocpl2 \ --enable-cluster-autoscaler \ --max-count 3 \ --min-count 1 \ --priority Spot \ --eviction-policy Delete \ --spot-max-price -1 \ --node-vm-size Standard_DS2_v2 \ --no-wait
選択した場所での容量制限のために、この要求が失敗する場合があることにご注意ください。
- 名前:
az aks nodepool show
コマンドを実行して、バッチ処理サービスの新しいスポット ノード プールの詳細を表示します。az aks nodepool show \ --resource-group $RESOURCE_GROUP \ --cluster-name $AKS_CLUSTER_NAME \ --name batchprocpl2
このコマンドの出力例を次に示します。
{ "agentPoolType": "VirtualMachineScaleSets", "availabilityZones": null, "count": 3, "enableAutoScaling": true, "enableNodePublicIp": false, "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl2", "maxCount": 3, "maxPods": 110, "minCount": 1, "mode": "User", "name": "batchprocpl2", "nodeImageVersion": "AKSUbuntu-1604-2020.06.10", "nodeLabels": { "kubernetes.azure.com/scalesetpriority": "spot" }, "nodeTaints": [ "kubernetes.azure.com/scalesetpriority=spot:NoSchedule" ], "orchestratorVersion": "1.17.9", "osDiskSizeGb": 128, "osType": "Linux", "provisioningState": "Creating", "proximityPlacementGroupId": null, "resourceGroup": "akscostsavinggrp", "scaleSetEvictionPolicy": "Delete", "scaleSetPriority": "Spot", "spotMaxPrice": -1.0, "tags": null, "type": "Microsoft.ContainerService/managedClusters/agentPools", "upgradeSettings": { "maxSurge": null }, "vmSize": "Standard_DS2_v2", "vnetSubnetId": null }
この結果では、いくつかの値が以前のノード プールとは明らかに異なっています。 これらの項目を確認してみましょう。
enableAutoScaling
プロパティ値がtrue
に設定されています。maxCount
とminCount
の値が両方とも設定されています。scaleSetEvictionPolicy
プロパティがDelete
に設定されています。scaleSetPriority
プロパティがSpot
に設定されています。spotMaxPrice
プロパティが-1
に設定されています。このノード プールには、
nodeLabels
とnodeTaints
が適用されます。 これらの値を使用して、ノード プールのノードにワークロードをスケジュールします。
名前空間を構成する
kubectl create namespace
コマンドを実行して、アプリケーション用のcostsavings
という名前空間を作成します。 この名前空間は、ワークロードを選択しやすくするために使用します。kubectl create namespace costsavings
先ほどのコマンドの出力は以下のようになります。
namespace/costsavings created
スポット ノード アフィニティを使用してポッドをスケジュールする
ポッドのデプロイ マニフェスト ファイルに容認およびアフィニティを追加することによって、スポット ノード上で実行されるようにポッドをスケジュールすることができます。 容認およびノード アフィニティがスポット ノードに適用されているテイントおよびラベルに対応している場合は、これらのノードでポッドがスケジュールされます。
スポット ノード プール内のノードには、kubernetes.azure.com/scalesetpriority=spot:NoSchedule
に等しいテイントおよび kubernetes.azure.com/scalesetpriority=spot
に等しいラベルが割り当てられます。 このキーと値のペアの情報は、ワークロードの YAML マニフェスト ファイルの tolerations
および affinity
セクションで使用します。 2 番目のバッチ処理プールがスポット ノード プールとして構成されている状態で、デプロイ ファイルを作成して、そのプールでワークロードを実行するようにスケジュールすることができます。
統合エディターを使用して
spot-node-deployment.yaml
という Kubernetes デプロイのマニフェスト ファイルを作成します。code spot-node-deployment.yaml
ヒント
Cloud Shell には、統合ファイル エディターが含まれています。 Cloud Shell エディターによって、言語の強調表示、コマンド パレット、エクスプローラーなどの機能がサポートされています。 Cloud Shell ターミナルで
code .
を実行してエディターを起動すると、ファイルを簡単に作成および編集できます。 この操作により、ターミナルでアクティブな作業ディレクトリが設定された状態でエディターが開きます。 迅速に編集するには、code spot-node-deployment.yaml
を実行して直接自分のマニフェスト ファイルを開きます。 このコマンドにより、ファイル エクスプローラーを使用せずにエディターが開きます。次のテキストをファイルに貼り付けます。
apiVersion: v1 kind: Pod metadata: name: nginx labels: env: test spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent tolerations: - key: "kubernetes.azure.com/scalesetpriority" operator: "Equal" value: "spot" effect: "NoSchedule" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: "kubernetes.azure.com/scalesetpriority" operator: In values: - "spot"
Ctrl+S キーを押してファイルを保存してから、Ctrl+Q キーを押してエディターを閉じます。
次のように、
kubectl apply
コマンドを実行して構成を適用し、costsavings
名前空間にアプリケーションをデプロイします。kubectl apply \ --namespace costsavings \ -f spot-node-deployment.yaml
先ほどのコマンドの出力は以下のようになります。
pod/nginx created
kubectl get pods
コマンドを実行する際に-o wide
フラグを使用して、実行中のポッドに関する詳細情報を取得できます。 ここでは、ポッドがスケジュールされているノードを確認します。costsavings
名前空間でポッドのクエリを実行してください。kubectl get pods --namespace costsavings -o wide
出力は次のようになります。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 43s 10.244.3.3 aks-batchprocpl2-25254417-vmss000000 <none> <none>
ノードの名前、
aks-batchprocpl2-25254417-vmss000000
に注目してください。 このノードは、前に作成したbatchprocpl2
スポット ノード プールの一部です。