演習 - AKS クラスターで複数のノードを構成し、ゼロへのスケーリングを有効にする
Azure Kubernetes Service では、さまざまなノード プールを作成して、各ノード プールで実行されているノードに特定のワークロードを適合させることができます。
過酷な気象条件下での飛行経路情報を処理し、最適な飛行ルートを作成する新しい予測型モデリング サービスをチームで開発したというドローン追跡の例を思い出してください。 このサービスは、GPU ベースの仮想マシン (VM) のサポートを必要とし、週の特定の曜日にのみ実行されます。 チームは、サービスが実行されないときに VM が使用されないようにしたいと考えています。
ここでは、Azure Kubernetes Service (AKS) マネージド Kubernetes クラスターを作成します。 次に、複数のノード プールをサポートするようにクラスターを構成し、クラスターがノード プール内のノードをスケーリングできるようにします。 そして、ノード数が動的なユーザー ワークロードをサポートするために 2 つ目のノード プールを追加します。 最後に、AKS クラスターで使用されるノードのコストを削減するために、ノード数をゼロにスケーリングします。
新しいリソース グループを作成する
自分の Azure アカウントで Azure Cloud Shell にサインインします。 Bash バージョンの Cloud Shell を選択します。
ここで作成した値は、このモジュールのすべての演習で再利用します。 後で使用するために出力を保存します。
リソース グループをホストするリージョンを選択します。 後の演習の機能は、すべてのリージョンで使用できるわけではありません。 このため、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
など) を実行して確認できます。AKS_CLUSTER_NAME
をメモします。 演習全体を通して、この値は後でクラスターのクリーンアップと構成設定に使います。echo $AKS_CLUSTER_NAME
rg-akscostsaving という新しいリソース グループを作成します。 このリソース グループでは、これらの演習で作成したすべてのリソースをデプロイします。 単一のリソース グループを使用すると、モジュールの完了後にリソースをより簡単にクリーンアップできます。
az group create \ --name $RESOURCE_GROUP \ --location $REGION_NAME
AKS クラスターを作成する
リソース グループを作成したら、そのグループ内に AKS クラスターを作成できます。 最初の手順では、選んだリージョンの Kubernetes バージョンを取得します。 このバージョンは、クラスターを構成するために設定されます。
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
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 つのノードのみを使用しています。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 } ]
ノード プールの
mode
がSystem
に設定され、name
が自動的に割り当てられたことに着目してください。
ノード プールを追加する
クラスター内のノード プールは 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
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 } ]
新しいノード プールの
mode
がUser
に設定され、name
がbatchprocpl
であることに着目してください。
ノード プールのノード数をゼロに増減させる
ノード プール内のノードを手動でスケーリングするには、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
コマンドを実行すると、クラスター内で使用可能なノードを確認できます。
ご利用のクラスターの 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
ノード プール内のノードを一覧表示します。
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 ベースのユーザー ノード プールはゼロに減らします。
ノードをスケーリングする必要があるが、需要を直接制御しないという戦略を見てみましょう。