演習 - 複数のノードを構成し、AKS クラスターでゼロへのスケールを有効にする
Azure Kubernetes Service を使用すると、特定のワークロードを各ノード プールで実行されているノードに一致させるために、異なるノード プールを作成できます。
ドローン追跡の例から、チームが、極端な気象条件で飛行経路情報を処理し、最適な飛行ルートを作成する新しい予測モデリング サービスを開発したことを思い出してください。 このサービスには GPU ベースの仮想マシン (VM) のサポートが必要であり、週の特定の日にのみ実行されます。 チームは、サービスが実行されないときに VMS が使用されないようにしたいと考えています。
ここでは、Azure Kubernetes Service (AKS) で管理される Kubernetes クラスターを作成します。 次に、複数のノード プールをサポートするようにクラスターを構成し、クラスターがノード プール内のノードをスケーリングできるようにします。 次に、動的ノード数のユーザー ワークロードをサポートする 2 つ目のノード プールを追加します。 最後に、ノード数をゼロにスケーリングして、AKS クラスターで使用されるノードのコストを削減します。
新しいリソース グループを作成する
Azure アカウントを使用して Azure Cloud Shell にサインインします。 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 という名前の新しいリソース グループを作成します。 このリソース グループでは、これらの演習で作成したすべてのリソースをデプロイします。 1 つのリソース グループを使用すると、モジュールの完了後にリソースを簡単にクリーンアップできます。
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
コマンドを実行して、クラスター内の使用可能なノードを確認できます。
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
ノード プール内のノードを一覧表示します。
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 ベースのユーザー ノード プールをゼロにスケーリングします。
ノードをスケーリングする必要があるが、需要を直接制御しない戦略を見てみましょう。