演習 - 複数のノードを構成し、AKS クラスターでゼロへのスケールを有効にする

完了

Azure Kubernetes Service を使用すると、特定のワークロードを各ノード プールで実行されているノードに一致させるために、異なるノード プールを作成できます。

ドローン追跡の例から、チームが、極端な気象条件で飛行経路情報を処理し、最適な飛行ルートを作成する新しい予測モデリング サービスを開発したことを思い出してください。 このサービスには GPU ベースの仮想マシン (VM) のサポートが必要であり、週の特定の日にのみ実行されます。 チームは、サービスが実行されないときに VMS が使用されないようにしたいと考えています。

ここでは、Azure Kubernetes Service (AKS) で管理される Kubernetes クラスターを作成します。 次に、複数のノード プールをサポートするようにクラスターを構成し、クラスターがノード プール内のノードをスケーリングできるようにします。 次に、動的ノード数のユーザー ワークロードをサポートする 2 つ目のノード プールを追加します。 最後に、ノード数をゼロにスケーリングして、AKS クラスターで使用されるノードのコストを削減します。

新しいリソース グループを作成する

  1. Azure アカウントを使用して Azure Cloud Shell にサインインします。 Cloud Shell の Bash バージョンを選択します。

  2. ここで作成した値は、このモジュールのすべての演習で再利用します。 後で使用するために出力を保存します。

  3. Cloud Shell ウィンドウの上部にある [設定]> [クラシック バージョンへ移動] を選択します。

  4. リソース グループをホストするリージョンを選択します。 以降の演習の機能は、すべてのリージョンで使用できるわけではありません。 このため、リージョンとして eastus を使用することをお勧めします。 別の値を使用する場合は、 REGION_NAMEの値を変更します。

    次のコマンドを実行して変数を登録します。

    REGION_NAME=eastus
    RESOURCE_GROUP=rg-akscostsaving
    AKS_CLUSTER_NAME=akscostsaving-$RANDOM
    

    ヒント

    [コピー] ボタンを使用して、コマンドをクリップボードにコピーできます。 貼り付けるには、Cloud Shell ターミナル内で新しい行を右クリックして [貼り付け] を選択するか、Shift + Insert キーボード ショートカット (macOS では ⌘ + V) を使用します。

    各値は、 echo コマンド ( echo $REGION_NAME など) を実行して確認できます。

  5. AKS_CLUSTER_NAMEをメモしてください。 演習全体を通して、この値は後でクラスターのクリーンアップと構成設定に使用します。

    echo $AKS_CLUSTER_NAME
    
  6. rg-akscostsaving という名前の新しいリソース グループを作成します。 このリソース グループでは、これらの演習で作成したすべてのリソースをデプロイします。 1 つのリソース グループを使用すると、モジュールの完了後にリソースを簡単にクリーンアップできます。

    az group create \
        --name $RESOURCE_GROUP \
        --___location $REGION_NAME
    

AKS クラスターを作成する

リソース グループを作成したら、グループ内に AKS クラスターを作成できます。 最初の手順は、選択したリージョンで Kubernetes バージョンを取得することです。 このバージョンは、クラスターを構成するように設定されています。

  1. Kubernetes のバージョンを取得するには、 az aks get-versions コマンドを実行します。 次のクエリでは、プレビュー以外の Kubernetes バージョンが返されます。 その値を、 VERSIONという名前の Bash 変数に格納します。 バージョン番号を取得して格納するには、次のコマンドを実行します。

    VERSION=$(az aks get-versions \
        --___location $REGION_NAME \
        --query "values[?isPreview==null].version | [1]" \
        --output tsv)
    echo $VERSION
    
  2. az aks create コマンドを実行して、AKS クラスターを作成します。 クラスターは、システム ノード プール内の 2 つのノードで実行されます。 このコマンドの完了には数分かかる場合があります。

    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_CLUSTER_NAME \
        --___location $REGION_NAME \
        --kubernetes-version $VERSION \
        --node-count 2 \
        --load-balancer-sku standard \
        --vm-set-type VirtualMachineScaleSets \
        --generate-ssh-keys
    

    az aks create コマンドには、Kubernetes クラスターの正確な構成を可能にするいくつかのパラメーターがあります。 クラスターでスケーリングと複数のノード プールの適切なサポートを構成するには、次の 2 つの重要なパラメーターがあります。

    パラメーターと値 説明
    --load-balancer-sku standard AKS での既定のロード バランサーのサポートは basic。 複数のノード プールを使用する場合、 basic ロード バランサーはサポートされません。 値を standard を設定します。
    --vm-set-type VirtualMachineScaleSets AKS でスケール機能を使用するには、仮想マシン スケール セットが必要です。 このパラメーターを使用すると、スケール セットのサポートが有効になります。

    --node-count 2 パラメーターを使用して、既定のノード プールに 2 つのノードが構成されていることに注意してください。 前の説明から、重要なシステム サービスがこのシステム ノード プール全体で実行されることを思い出してください。 運用クラスターでは、クラスター操作の信頼性のために少なくとも --node-count 3 を使用することが重要です。 ここでは、この演習のコストに関する考慮事項として 2 つのノードのみを使用しています。

  3. az aks nodepool list コマンドを実行して、新しいクラスター内のノード プールを一覧表示します。

    az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
    

    コマンドからの出力の例を次に示します。

    [
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1",
        "mode": "System",
        "name": "nodepool1",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": null,
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      }
    ]
    

    ノード プールの modeSystem に設定され、 name が自動的に割り当てられていることに注意してください。

ノード プールを追加する

  1. クラスターには 1 つのノード プールがあります。 az aks nodepool add コマンドを実行して、2 つ目のノード プールを追加します。 この手順のコマンドを実行して、3 つのノードと名前 batchprocplを持つユーザー ノード プールを作成します。 ノード プール名は小文字で始まり、英数字のみを含む必要があることに注意してください。 ノード プール名は、Linux ノード プールの場合は 12 文字、Windows ノード プールの場合は 6 文字に制限されます。

    次のコマンドを実行します。

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl \
        --node-count 2
    
  2. az aks nodepool list コマンドを実行して、新しいクラスター内の新しいノード プールを一覧表示します。

    az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
    

    コマンドからの出力の例を次に示します。

    [
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
        "mode": "User",
        "name": "batchprocpl",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": {
          "maxSurge": null
        },
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      },
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1",
        "mode": "System",
        "name": "nodepool1",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": null,
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      }
    ]
    

    新しいノード プールの modeUser に設定されていること、および namebatchprocplされていることに注意してください。

ノード プール ノード数をゼロにスケーリングする

az aks nodepool scale コマンドを実行して、ノード プール内のノードを手動でスケーリングします。

az aks nodepool scale コマンドを実行し、--node-count パラメーターを使用してノード数の値を 0 に設定します。

コマンドの例を次に示します。

az aks nodepool scale \
    --resource-group $RESOURCE_GROUP \
    --cluster-name $AKS_CLUSTER_NAME \
    --name batchprocpl \
    --node-count 0

コマンドからの出力の例を次に示します。

{
  "agentPoolType": "VirtualMachineScaleSets",
  "availabilityZones": null,
  "count": 0,
  "enableAutoScaling": null,
  "enableNodePublicIp": false,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
  "maxCount": null,
  "maxPods": 110,
  "minCount": null,
  "mode": "User",
  "name": "batchprocpl",
  "nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
  "nodeLabels": null,
  "nodeTaints": null,
  "orchestratorVersion": "1.17.9",
  "osDiskSizeGb": 128,
  "osType": "Linux",
  "provisioningState": "Succeeded",
  "proximityPlacementGroupId": null,
  "resourceGroup": "rg-akscostsaving",
  "scaleSetEvictionPolicy": null,
  "scaleSetPriority": null,
  "spotMaxPrice": null,
  "tags": null,
  "type": "Microsoft.ContainerService/managedClusters/agentPools",
  "upgradeSettings": {
    "maxSurge": null
  },
  "vmSize": "Standard_DS2_v2",
  "vnetSubnetId": null
}

ノード プール count パラメーター値が 0 に設定されていること、および enableAutoScaling 値が null に設定されていることに注意してください。 既定ではノードの作成が自動的に行われないため、ワークロードをスケジュールするには、このノード プールのノード数を手動で増やす必要があります。

Kubernetes コンテキストを構成する

前のコマンドからの出力では、ノード プールの数は 0 に設定されています。 kubectl get nodes コマンドを実行して、クラスター内の使用可能なノードを確認できます。

  1. kubectlを実行して、クラスターの API サーバーと対話します。 kubectlが接続できるように Kubernetes クラスター コンテキストを構成する必要があります。 コンテキストには、クラスターのアドレス、ユーザー、および名前空間が含まれます。 az aks get-credentials コマンドを実行して、Cloud Shell で Kubernetes コンテキストを構成します。

    次のコマンドを実行して、クラスターの資格情報を取得します。

    az aks get-credentials \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_CLUSTER_NAME
    

    コマンドからの出力の例を次に示します。

    Merged "akscostsaving-17835" as current context in /home/user/.kube/config
    
  2. ノード プール内のノードを一覧表示します。

    kubectl get nodes
    

    コマンド出力の例を次に示します。

    NAME                                STATUS   ROLES   AGE   VERSION
    aks-nodepool1-37990379-vmss000000   Ready    agent   32m   v1.17.9
    aks-nodepool1-37990379-vmss000001   Ready    agent   32m   v1.17.9
    

    az aks nodepool list コマンドで 2 つのノード プールが一覧表示されている場合でも、クラスター内で使用できるノードは 2 つだけであり、両方とも nodepool1 からのノードであることに注意してください。

ワークロードの需要を直接管理するときに AKS のコストを最適化するには、次の方法が適しています。

  • ノード プール内のノード数を手動でスケーリングします。
  • コストの高い NV ベースのユーザー ノード プールをゼロにスケーリングします。

ノードをスケーリングする必要があるが、需要を直接制御しない戦略を見てみましょう。