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

完了

Azure Kubernetes Service では、さまざまなノード プールを作成して、各ノード プールで実行されているノードに特定のワークロードを適合させることができます。

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

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

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

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

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

  3. リソース グループをホストするリージョンを選択します。 後の演習の機能は、すべてのリージョンで使用できるわけではありません。 このため、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 など) を実行して確認できます。

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

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

    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. ご利用のクラスターの API サーバーとやりとりするには、kubectl を実行します。 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 ベースのユーザー ノード プールはゼロに減らします。

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