演習 - AKS クラスターでクラスター自動スケーラーを使用してスポット ノード プールを構成する

完了

スポット ユーザー ノード プールは、ハイパフォーマンス コンピューティング シナリオをサポートしながら、使われていない Azure コンピューティング容量に低価格でアクセスできます。

前の演習では、標準ユーザー ノード プールを作成し、クラスター自動スケーラーを使用してノードの作成を管理し、ノード数を手動でスケーリングしました。

次の手順では、自動スケーリングを使ってスポット ユーザー ノード プールを追加することで、クラスターの運用コストを削減します。 クラスターの使用量は必要なリソースによって異なり、予測できないため、スパイクとディップを捉える規則を設定します。 ノード アフィニティを有効にしてワークロードをデプロイし、スポット ノード プールのノードにポッドがスケジュールされるようにします。

スポット ノード プールを作成する

バッチ処理サービスをサポートする、独立したノード プールを作成する必要があります。 このノード プールは、"削除" の削除ポリシーと、-1 のスポット最大価格を使用するスポット ノード プールです。

  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
    

    選択した場所での容量制限のために、この要求が失敗する場合があることにご注意ください。

  2. 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 に設定されています。

    • maxCountminCount の値が両方とも設定されています。

    • scaleSetEvictionPolicy プロパティが Delete に設定されています。

    • scaleSetPriority プロパティが Spot に設定されています。

    • spotMaxPrice プロパティが -1 に設定されています。

    • このノード プールには、nodeLabelsnodeTaints が適用されます。 これらの値を使用して、ノード プールのノードにワークロードをスケジュールします。

名前空間を構成する

  1. 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 番目のバッチ処理プールがスポット ノード プールとして構成されている状態で、デプロイ ファイルを作成して、そのプールでワークロードを実行するようにスケジュールすることができます。

  1. 統合エディターを使用して spot-node-deployment.yaml という Kubernetes デプロイのマニフェスト ファイルを作成します。

    code spot-node-deployment.yaml
    

    ヒント

    Cloud Shell には、統合ファイル エディターが含まれています。 Cloud Shell エディターによって、言語の強調表示、コマンド パレット、エクスプローラーなどの機能がサポートされています。 Cloud Shell ターミナルで code . を実行してエディターを起動すると、ファイルを簡単に作成および編集できます。 この操作により、ターミナルでアクティブな作業ディレクトリが設定された状態でエディターが開きます。 迅速に編集するには、code spot-node-deployment.yaml を実行して直接自分のマニフェスト ファイルを開きます。 このコマンドにより、ファイル エクスプローラーを使用せずにエディターが開きます。

  2. 次のテキストをファイルに貼り付けます。

    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"
    
  3. Ctrl+S キーを押してファイルを保存してから、Ctrl+Q キーを押してエディターを閉じます。

  4. 次のように、kubectl apply コマンドを実行して構成を適用し、costsavings 名前空間にアプリケーションをデプロイします。

    kubectl apply \
    --namespace costsavings \
    -f spot-node-deployment.yaml
    

    先ほどのコマンドの出力は以下のようになります。

    pod/nginx created
    
  5. 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 スポット ノード プールの一部です。