Azure Arc で有効になっている AKS でクラスターの自動スケールに PowerShell を使用する
適用対象: AKS on Azure Stack HCI 22H2、Windows Server 上の AKS
PowerShell を使用すると、自動スケーラーを有効にしたり、Arc で有効になっている AKS 内のターゲット クラスター内のノード プールの自動スケーリングを管理したりできます。PowerShell を使用して、クラスターの自動スケールを構成および管理することもできます。
新しい AksHciAutoScalerConfig オブジェクトを作成する
New-AksHciCluster
または Set-AksHciCluster
コマンドに渡す新しい AksHciAutoScalerConfig オブジェクトを作成するには、次のコマンドを使用します。
New-AksHciAutoScalerProfile -Name asp1 -AutoScalerProfileConfig @{ "min-node-count"=2; "max-node-count"=7; 'scale-down-unneeded-time'='1m'}
クラスターを作成するときに autoscalerconfig オブジェクトを指定できます。 オブジェクトには、自動スケーラーに関するパラメーターが含まれています。 パラメーター情報については、「 自動スケーラー プロファイルの使用方法を参照してください。
既存の AksHciAutoScalerConfig プロファイル オブジェクトを変更する
既存の AksHciAutoScalerConfig プロファイル オブジェクトを更新すると、そのオブジェクトを使用するクラスターが更新され、新しいパラメーターが使用されます。
Set-AksHciAutoScalerProfile -name myProfile -autoScalerProfileConfig @{ "max-node-count"=5; "min-node-count"=2 }
オートスケーラーのパラメーターを含む autoscalerconfig オブジェクトを更新できます。 パラメーター情報については、「 自動スケーラー プロファイルの使用方法を参照してください。
新しいクラスターの自動スケーリングを有効にする
新しく作成されたすべてのノード プールで自動スケールを自動的に有効にするには、 New-AksHciCluster
コマンドで次のパラメーターを使用します。
New-AksHciCluster -name mycluster -enableAutoScaler -autoScalerProfileName myAutoScalerProfile
既存のクラスターで自動スケーリングを有効にする
既存のクラスターで新しく作成された各ノード プールで自動スケールを自動的に有効にするには、Set-AksHciCluster
コマンドで enableAutoScaler
パラメーターを使用します。
Set-AksHciCluster -Name <string> [-enableAutoScaler <boolean>] [-autoScalerProfileName <String>]
既存のノード プールで自動スケールを有効にする
既存のノード プールで自動スケールを有効にするには、Set-AksHciNodePool
コマンドで autoScaler
パラメーターを使用します。
Set-AksHciNodePool -clusterName <Your-Cluster-Name> -name <Your-NodePool-Name> -autoScaler $true
自動スケーリングを無効にする
既存のクラスター上のすべての既存のノード プールと新しく作成されたノード プールで自動スケールを無効にするには、Set-AksHciCluster
コマンドを使用してenableAutoScaler
を false に設定します。
Set-AksHciCluster -Name <string> -enableAutoScaler $false
水平自動スケーラーを効果的に活用する
クラスターとノード プールが自動的にスケーリングされるように構成されたので、水平オートスケーラー機能を使用する方法でもスケーリングするようにワークロードを構成できます。
ワークロードのスケーリングには、次の 2 つの方法を使用できます。
- Kubernetes Horizontal Pod Autoscaler: 負荷特性に基づいて、水平ポッド オートスケーラー ( horizontal autoscaler とも呼ばれます) は、アプリケーションデプロイのポッドを Kubernetes クラスター内の使用可能なノードにスケーリングします。 スケジュール可能なノードがこれ以上ない場合、水平オートスケーラーはポッドをスケジュールする新しいノードをインスタンス化します。 アプリケーションの負荷がダウンした場合、ノードは再びスケール バックされます。
- Kubernetes ノードのアンチアフィニティ ルール: Kubernetes デプロイのアンチアフィニティ ルールでは、一連のポッドを同じノードでスケーリングできないことを指定できます。また、ワークロードをスケーリングするには別のノードが必要です。 水平オートスケーラーは、負荷特性またはアプリケーション インスタンスのターゲット ポッドの数と組み合わせて、要求を満たすためにノード プール内の新しいノードをインスタンス化します。 アプリケーションの需要が減ると、水平オートスケーラーによってノード プールが再びスケールダウンされます。
このセクションには、いくつかの例が含まれています。
ポッドの水平オートスケーラー
前提条件:
- Arc で有効になっている AKS がインストールされています。
- ターゲット クラスターがインストールされ、Azure に接続されます。
- 1 つの Linux ノード プールがデプロイされ、少なくとも 1 つのアクティブな Linux ワーカー ノードが含まれます。
- 前に説明したように、水平ノード オートスケーラーは、ターゲット クラスターと Linux ノード プールで有効になります。
ここでは、 Kubernetes Horizontal Pod Autoscaler Walkthrough の例 を使用して、ポッドの水平オートスケーラーのしくみを示します。
ポッドの水平オートスケーラーを機能させるには、ターゲット クラスターに Metrics Server コンポーネントをデプロイする必要があります。
メトリック サーバーを mycluster
というターゲット クラスターにデプロイするには、次のコマンドを実行します。
Get-AksHciCredential -name mycluster
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Kubernetes Metrics Server がデプロイされたら、スケーリングに使用するノード プールにアプリケーションをデプロイできます。 この例では、Kubernetes コミュニティ Web サイトのテスト アプリケーションを使用します。
kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
deployment.apps/php-apache created
service/php-apache created
このコマンドは、呼び出し元のクライアントに "OK" メッセージを返す Apache Web サーバー ベースの PHP アプリケーションのデプロイを作成します。
次に、現在のポッドの CPU 使用率が 50% に達したときに新しいポッドをスケジュールし、1 から 50 ポッドにスケーリングするように、水平ポッド オートスケーラーを構成します。
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled
次のコマンドを実行して、新しく作成された水平ポッド オートスケーラーの現在の状態を確認できます。
kubectl get hpa
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 18s
最後に、Web サーバーの負荷を増やして、スケールアウトを確認します。新しい PowerShell ウィンドウを開き、次のコマンドを実行します。
kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
前の PowerShell ウィンドウに戻って次のコマンドを実行すると、短期間でポッドの数が変化することがわかります。
kubectl get hpa php-apache --watch
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 305% / 50% 1 10 1 3m
この例では、次に示すように、ポッドの数が 1 から 7 に変わります。
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 305% / 50% 1 10 7 3m
すべてのポッドが 1 つのノードに収まるため、ノード オートスケーラーをトリガーするのに十分でない場合は、より多くの PowerShell ウィンドウを開き、より多くのロード ジェネレーター コマンドを実行します。 コマンドを実行するたびに、作成するポッドの名前を必ず変更してください。 たとえば、次のコマンドに示すように、load-generator
の代わりにload-generator-2
を使用します。
kubectl run -i --tty load-generator-2 --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
次のコマンドを使用して、インスタンス化されたノードの数を確認します。
kubectl get nodes
NAME STATUS ROLES AGE VERSION
moc-laondkmydzp Ready control-plane,master 3d4h v1.22.4
moc-lorl6k76q01 Ready <none> 3d4h v1.22.4
moc-lorl4323d02 Ready <none> 9m v1.22.4
moc-lorl43bc3c3 Ready <none> 2m v1.22.4
スケールダウンを監視するには、Ctrl キーを押しながら C キーを押してロード ジェネレーター ポッドを終了し、それらに関連付けられている PowerShell ウィンドウを閉じます。 約 30 分後に、ポッドの数が減少します。 約 30 分後、ノードはプロビジョニング解除されます。
Kubernetes Horizontal Pod Autoscaler の詳細については、「 Horizontal Pod Autoscalingを参照してください。
ノード アフィニティ ルール
ノード アフィニティ ルールを使用すると、Kubernetes スケジューラで、ノードの特定の特性に基づいて、クラスターまたはノード プール内の特定のノード セットでのみポッドを実行できます。 水平ノード オートスケーラーの機能を表示するには、同じルールを使用して、特定のポッドの 1 つのインスタンスのみが各ノードで実行されるようにすることができます。
前提条件:
- AKS Arc がインストールされています。
- ターゲット クラスターがインストールされ、Azure に接続されます。
- 1 つの Linux ノード プールがデプロイされ、少なくとも 1 つのアクティブな Linux Worker ノードが含まれます。
- 前に説明したように、水平ノード オートスケーラーはターゲット クラスターと Linux ノード プールで有効になっています。
次の内容の YAML ファイルを作成し、 node-anti-affinity.yaml としてローカル フォルダーに保存します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-cache
spec:
selector:
matchLabels:
app: store
replicas: 4
template:
metadata:
labels:
app: store
spec:
nodeSelector:
kubernetes.io/os: linux
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- store
topologyKey: "kubernetes.io/hostname"
containers:
- name: redis-server
image: redis:3.2-alpine
PowerShell ウィンドウを開き、ターゲット クラスターの資格情報を読み込みます。 この例では、クラスターの名前は次 mycluster
。
Get-AksHciCredential -name mycluster
次に、ターゲット クラスターに YAML ファイルを適用します。
kubectl apply -f node-anti-affinity.yaml
数分後に、次のコマンドを使用して、新しいノードがオンラインであることを確認できます。
kubectl get nodes
NAME STATUS ROLES AGE VERSION
moc-laondkmydzp Ready control-plane,master 3d4h v1.22.4
moc-lorl6k76q01 Ready <none> 3d4h v1.22.4
moc-lorl4323d02 Ready <none> 9m v1.22.4
moc-lorl43bc3c3 Ready <none> 9m v1.22.4
moc-lorl44ef56c Ready <none> 9m v1.22.4
ノードを削除するには、次のコマンドを使用して Redis サーバーのデプロイを削除します。
kubectl delete -f node-anti-affinity.yaml
Kubernetes ポッドアフィニティ ルールの詳細については、「 ノードへのポッドの割り当て」を参照してください。
水平自動ケーラーのトラブルシューティング
ターゲット クラスターに対して水平ポッド オートスケーラーが有効になっている場合、 <cluster_name>-cluster-autoscaler
という新しい Kubernetes デプロイが管理クラスターに作成されます。 このデプロイによって、ターゲット クラスターが監視され、ポッドをスケジュールするのに十分なワーカー ノードがあることが確認されます。
自動スケーラーに関連する問題をデバッグするさまざまな方法を次に示します。
管理クラスターで実行されているクラスター オートスケーラー ポッドは、スケーリングの決定方法、起動または削除する必要があるノードの数、発生する可能性がある一般的なエラーに関する有用な情報を収集します。 自動スケーラーは、この情報をログに保存します。 次のコマンドを実行してログにアクセスします。
kubectl --kubeconfig $(Get-AksHciConfig).Kva.kubeconfig logs -l app=<cluster_name>-cluster-autoscaler
クラウド オペレーター のログには、管理クラスター内の Kubernetes イベントが記録されます。これは、クラスターとノード プールに対して自動スケーラーが有効または無効になっているタイミングを理解するのに役立ちます。 これらは、次のコマンドを実行して表示できます。
kubectl --kubeconfig $(Get-AksHciConfig).Kva.kubeconfig get events
クラスター自動スケーラーのデプロイでは、それが管理するターゲット クラスターに
configmap
が作成されます。 このconfigmap
は、オートスケーラーの状態クラスター全体のレベルとノード プールごとの情報を保持します。 ターゲット クラスターに対して次のコマンドを実行して、状態を表示します。Note
対象のターゲット クラスターにアクセスするには、
Get-AksHciCredentials -Name <clustername>
を実行してkubeconfig
の情報を取得してあることを確認してください。kubectl --kubeconfig ~\.kube\config get configmap cluster-autoscaler-status -o yaml
クラスター オートスケーラーは、クラスターのノード プールをスケーリングするときに
configmap
クラスター オートスケーラーの状態に関するイベントをログに記録します。 これらのログを表示するには、ターゲット クラスターに対して次のコマンドを実行します。kubectl --kubeconfig ~\.kube\config describe configmap cluster-autoscaler-status
クラスター自動スケーラーは、ポッドをスケジュールできない場合にスケーリングの決定を行うと、ターゲット クラスターのポッドでイベントを出力します。 ポッドでのイベントを表示するには、次のコマンドを実行します。
kubectl --kubeconfig ~\.kube\config describe pod <pod_name>
PowerShell リファレンス
クラスターの自動スケールをサポートする PowerShell コマンドレットについては、次のリファレンス ページを参照してください。
- Get-AksHciAutoScalerProfile
- AKS 用の Get-AksHciCluster
- AKS 用の Get-AksHciNodePool
- New-AksHciAutoScalerProfile
- New-AksHciCluster
- New-AksHciNodePool
- Remove-AksHciAutoScalerProfile
- Set-AksHciAutoScalerProfile
- Set-AksHciCluster
- Set-AksHciNodePool