次の方法で共有


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 コマンドレットについては、次のリファレンス ページを参照してください。

次のステップ