次の方法で共有


Azure Kubernetes Service (AKS) で Vertical Pod Autoscaler を使用する

この記事は、Azure Kubernetes Service (AKS) クラスターで Vertical Pod Autoscaler (VPA) を使用する方法について示しています。 VPA は、ワークロードの使用パターンに合わせて、ポッドの CPU とメモリの要求を自動的に調整します。 この機能は、アプリケーションのパフォーマンスを最適化し、AKS でワークロードを実行するコストを削減するのに役立ちます。

詳細については、Vertical Pod Autoscaler の概要に関する記事を参照してください。

開始する前に

  • 既存の AKS クラスターをお持ちの場合は、Kubernetes バージョン 1.24 以降を実行していることを確認してください。

  • Azure CLI バージョン 2.52.0 以降がインストールされて構成されている必要があります。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

  • 既存のクラスターで VPA を有効にする場合は、kubectl がインストールされ、az aks get-credentials コマンドを使用して AKS クラスターに接続するように構成されていることを確認してください。

    az aks get-credentials --name <cluster-name> --resource-group <resource-group-name>
    

新しいクラスター上に Vertical Pod Autoscaler をデプロイする

  • --enable-vpa フラグを指定した az aks create コマンドを使用して、VPA が有効な新しい AKS クラスターを作成します。

    az aks create --name <cluster-name> --resource-group <resource-group-name> --enable-vpa --generate-ssh-keys
    

    数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。

Vertical Pod Autoscaler を使用するように既存のクラスターを更新する

  • --enable-vpa フラグを指定した az aks update コマンドを使用して、VPA を使用するように既存のクラスターを更新します。

    az aks update --name <cluster-name> --resource-group <resource-group-name> --enable-vpa 
    

    数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。

既存のクラスター上で Vertical Pod Autoscaler を無効にする

  • --disable-vpa フラグを指定した az aks update コマンドを使用して、既存のクラスターで VPA を無効にします。

    az aks update --name <cluster-name> --resource-group <resource-group-name> --disable-vpa
    

    数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。

Vertical Pod Autoscaler のインストールをテストする

次の例では、それぞれ 100 ミリコアを要求し、500 ミリコアをわずかに上回って利用しようとする 1 つのコンテナーを実行する、2 つのポッドを含むデプロイを作成しています。 また、デプロイを指す VPA 構成も作成します。 この VPA がポッドの動作を監視し、約 5 分後により 500 ミリコアを要求するようにポッドを更新します。

  1. hamster.yaml という名前のファイルを作成し、kubernetes/autoscaler GitHub リポジトリから Vertical Pod Autoscaler の例の次のマニフェストをコピーします。

    apiVersion: "autoscaling.k8s.io/v1"
    kind: VerticalPodAutoscaler
    metadata:
      name: hamster-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind: Deployment
        name: hamster
      resourcePolicy:
        containerPolicies:
          - containerName: '*'
            minAllowed:
              cpu: 100m
              memory: 50Mi
            maxAllowed:
              cpu: 1
              memory: 500Mi
            controlledResources: ["cpu", "memory"]
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hamster
    spec:
      selector:
        matchLabels:
          app: hamster
      replicas: 2
      template:
        metadata:
          labels:
            app: hamster
        spec:
          securityContext:
            runAsNonRoot: true
            runAsUser: 65534
          containers:
            - name: hamster
              image: registry.k8s.io/ubuntu-slim:0.1
              resources:
                requests:
                  cpu: 100m
                  memory: 50Mi
              command: ["/bin/sh"]
              args:
                - "-c"
                - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"
    
  2. kubectl apply コマンドを使用して、hamster.yaml Vertical Pod Autoscaler の例をデプロイします。

    kubectl apply -f hamster.yaml
    

    数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。

  3. kubectl get コマンドを使用して、実行中のポッドを表示します。

    kubectl get pods -l app=hamster
    

    出力は次の出力例のようになります。

    hamster-78f9dcdd4c-hf7gk   1/1     Running   0          24s
    hamster-78f9dcdd4c-j9mc7   1/1     Running   0          24s
    
  4. kubectl describe コマンドを使用して、いずれかのポッドの CPU とメモリの予約を表示します。 <example-pod> を、前のステップの出力で返されたポッド ID のいずれかに置き換えてください。

    kubectl describe pod hamster-<example-pod>
    

    出力は次の出力例のようになります。

     hamster:
        Container ID:  containerd://
        Image:         k8s.gcr.io/ubuntu-slim:0.1
        Image ID:      sha256:
        Port:          <none>
        Host Port:     <none>
        Command:
          /bin/sh
        Args:
          -c
          while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
        State:          Running
          Started:      Wed, 28 Sep 2022 15:06:14 -0400
        Ready:          True
        Restart Count:  0
        Requests:
          cpu:        100m
          memory:     50Mi
        Environment:  <none>
    

    この例では、ポットでは 100 millicpu と 50 メビバイトのメモリが予約されています。 このサンプル アプリケーションの場合、ポッドの実行に必要なのは 100 millicpu 未満なので、使用可能な CPU 容量はありません。 また、ポッドでは、必要な量より少ないメモリが予約されます。 Vertical Pod Autoscaler の vpa-recommender デプロイでは、hamster アプリケーションをホストしているポッドを分析して、CPU とメモリの要件が適切かどうかを確認します。 調整が必要な場合、vpa-updater では更新された値でポッドを再起動します。

  5. kubectl get コマンドを使用して、ポッドを監視します。

    kubectl get --watch pods -l app=hamster
    
  6. 新しい hamster ポッドが起動すると、kubectl describe コマンドを使用して、更新された CPU とメモリの予約を表示できます。 <example-pod> を、前のステップの出力で返されたポッド ID のいずれかに置き換えてください。

    kubectl describe pod hamster-<example-pod>
    

    出力は次の出力例のようになります。

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    

    前の出力では、CPU 予約が 587 millicpu に増加し、元の値の 5 倍を超えていることがわかります。 メモリは 262,144 キロバイトに増加しました。これは約 250 メビバイト (元の値の 5 倍) です。 このポッドはリソース不足であり、Vertical Pod Autoscaler ではより適切な値で見積もりを修正しました。

  7. VPA から更新された推奨事項を表示するには、kubectl describe コマンドを実行して hamster-vpa リソース情報を記述します。

    kubectl describe vpa/hamster-vpa
    

    出力は次の出力例のようになります。

     State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    

Vertical Pod Autoscaler の要求を設定する

VerticalPodAutoscaler オブジェクトは、AutoupdateMode を使用してポッドにリソース要求を自動的に設定します。 要件とテストに応じて異なる値を設定できます。 この例では、2 つのポッドを含む配置マニフェストを作成してテストします。それぞれが 100 milliCPU と 50 MiB のメモリを要求するコンテナーを実行し、updateModeRecreate に設定します。

  1. azure-autodeploy.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vpa-auto-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: vpa-auto-deployment
      template:
        metadata:
          labels:
            app: vpa-auto-deployment
        spec:
          containers:
          - name: mycontainer
            image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
            resources:
              requests:
                cpu: 100m
                memory: 50Mi
            command: ["/bin/sh"]
            args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
    
  2. kubectl create コマンドを使用してポッドを作成します。

    kubectl create -f azure-autodeploy.yaml
    

    数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。

  3. kubectl get コマンドを使用して、実行中のポッドを表示します。

    kubectl get pods
    

    出力は次の出力例のようになります。

    NAME                                   READY   STATUS    RESTARTS   AGE
    vpa-auto-deployment-54465fb978-kchc5   1/1     Running   0          52s
    vpa-auto-deployment-54465fb978-nhtmj   1/1     Running   0          52s
    
  4. azure-vpa-auto.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: vpa-auto
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       vpa-auto-deployment
      updatePolicy:
        updateMode: "Recreate"
    

    targetRef.name 値は、vpa-auto-deployment という名前のデプロイによって制御されるすべてのポッドが VerticalPodAutoscaler に属することを指定します。 updateMode 値が Recreate であるということは、Vertical Pod Autoscaler コントローラーでポッドを削除し、CPU とメモリの要求を調整してから、新しいポッドを作成できることを意味します。

  5. kubectl apply コマンドを使用して、マニフェストをクラスターに適用します。

    kubectl create -f azure-vpa-auto.yaml
    
  6. 数分待ってから、kubectl get コマンドを使用して実行中のポッドを表示します。

    kubectl get pods
    

    出力は次の出力例のようになります。

    NAME                                   READY   STATUS    RESTARTS   AGE
    vpa-auto-deployment-54465fb978-qbhc4   1/1     Running   0          2m49s
    vpa-auto-deployment-54465fb978-vbj68   1/1     Running   0          109s
    
  7. kubectl get コマンドを使用して、実行中のいずれかのポッドに関する詳細情報を取得します。 <pod-name> は、前の出力のいずれかのポッドの名前に置き換えてください。

    kubectl get pod <pod-name> --output yaml
    

    出力は次の出力例のようになります。これは、VPA コントローラーがメモリ要求を 262144k に、CPU 要求を 25 milliCPU に増やしたことを示しています。

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        vpaObservedContainers: mycontainer
        vpaUpdates: 'Pod resources updated by vpa-auto: container 0: cpu request, memory
          request'
      creationTimestamp: "2022-09-29T16:44:37Z"
      generateName: vpa-auto-deployment-54465fb978-
      labels:
        app: vpa-auto-deployment
    
    spec:
      containers:
      - args:
        - -c
        - while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
        command:
        - /bin/sh
        image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
        imagePullPolicy: IfNotPresent
        name: mycontainer
        resources:
          requests:
            cpu: 25m
            memory: 262144k
    
  8. Vertical Pod Autoscaler に関する詳細情報と、CPU とメモリに関する推奨事項を取得するには、kubectl get コマンドを使用します。

    kubectl get vpa vpa-auto --output yaml
    

    出力は次の出力例のようになります。

     recommendation:
      containerRecommendations:
      - containerName: mycontainer
        lowerBound:
          cpu: 25m
          memory: 262144k
        target:
          cpu: 25m
          memory: 262144k
        uncappedTarget:
          cpu: 25m
          memory: 262144k
        upperBound:
          cpu: 230m
          memory: 262144k
    

    この例の、target 属性の結果は、コンテナーを最適に実行するために、CPU やメモリのターゲットを変更する必要がないことを示しています。 ただし、結果は、アプリケーションとそのリソース使用率によって異なる場合があります。

    Vertical Pod Autoscaler では、lowerBound および upperBound 属性を使用して、ポッドを削除して新しいポッドに置き換えるかどうかを決定します。 ポッドに下限より小さいか上限より大きい要求がある場合、Vertical Pod Autoscaler ではポッドを削除し、ターゲット属性を満たすポッドに置き換えます。

Vertical Pod Autoscaler の追加のレコメンダー

このレコメンダーは、リアルタイムのリソース消費量に基づいてリソース配分状況に関する推奨事項を提供します。 クラスターで VPA を有効にすると、AKS はレコメンダーをデプロイします。 カスタマイズされたレコメンダーまたは既定と同じイメージを持つ追加のレコメンダーをデプロイできます。 カスタマイズされたレコメンダーを使用する利点は、推奨事項のロジックをカスタマイズできることです。 追加のレコメンダーを使用すると、VPA をパーティション分割して、異なるレコメンダーを使用できます。

次の例では、追加のレコメンダーを作成し、既存の AKS クラスターに適用し、追加のレコメンダーを使用するように VPA オブジェクトを構成しています。

  1. extra_recommender.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。

    apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
      name: extra-recommender 
      namespace: kube-system 
    spec: 
      replicas: 1 
      selector: 
        matchLabels: 
          app: extra-recommender 
      template: 
        metadata: 
          labels: 
            app: extra-recommender 
        spec: 
          serviceAccountName: vpa-recommender 
          securityContext: 
            runAsNonRoot: true 
            runAsUser: 65534
          containers: 
          - name: recommender 
            image: registry.k8s.io/autoscaling/vpa-recommender:0.13.0 
            imagePullPolicy: Always 
            args: 
              - --recommender-name=extra-recommender 
            resources: 
              limits: 
                cpu: 200m 
                memory: 1000Mi 
              requests: 
                cpu: 50m 
                memory: 500Mi 
            ports: 
            - name: prometheus 
              containerPort: 8942 
    
  2. kubectl apply コマンドを使用して、extra-recomender.yaml Vertical Pod Autoscaler の例をデプロイします。

    kubectl apply -f extra-recommender.yaml 
    

    数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。

  3. hamster-extra-recommender.yaml という名前のファイルを作成し、そこに次のマニフェストをコピーします。

    apiVersion: "autoscaling.k8s.io/v1" 
    kind: VerticalPodAutoscaler 
    metadata: 
      name: hamster-vpa 
    spec: 
      recommenders:  
        - name: 'extra-recommender' 
      targetRef: 
        apiVersion: "apps/v1" 
        kind: Deployment 
        name: hamster 
      updatePolicy: 
        updateMode: "Auto" 
      resourcePolicy: 
        containerPolicies: 
          - containerName: '*' 
            minAllowed: 
              cpu: 100m 
              memory: 50Mi 
            maxAllowed: 
              cpu: 1 
              memory: 500Mi 
            controlledResources: ["cpu", "memory"] 
    --- 
    apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
      name: hamster 
    spec: 
      selector: 
        matchLabels: 
          app: hamster 
      replicas: 2 
      template: 
        metadata: 
          labels: 
            app: hamster 
        spec: 
          securityContext: 
            runAsNonRoot: true 
            runAsUser: 65534 # nobody 
          containers: 
            - name: hamster 
              image: k8s.gcr.io/ubuntu-slim:0.1 
              resources: 
                requests: 
                  cpu: 100m 
                  memory: 50Mi 
              command: ["/bin/sh"] 
              args: 
                - "-c" 
                - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done" 
    

    controlledResourcesmemory が指定されていない場合、レコメンダーは OOM イベントに応答しません。 この例では、controlledValues で CPU のみを設定します。 controlledValues では、RequestsOnly オプションでコンテナーのリソース要求を更新するか、RequestsAndLimits オプションでリソース要求と制限の両方を更新するかを選択できます。 既定値は RequestsAndLimits です。 RequestsAndLimits オプションを使用する場合、要求は実際の使用量に基づいて計算され、制限は現在のポッドの要求と制限の比率に基づいて計算されます。

    たとえば、2 つの CPU を要求し、CPU を 4 つまでに制限するポッドから開始する場合、VPA は常に制限を要求の 2 倍に設定します。 同じ原則がメモリにも適用されます。 RequestsAndLimits モードを使用すると、これは最初のアプリケーション リソースの要求と制限のブループリントとして機能します。

    Auto モードを使用し、CPU とメモリの両方に対する推奨事項を計算することで、VPA オブジェクトを簡素化できます。

  4. kubectl apply コマンドを使用して、hamster-extra-recomender.yaml の例をデプロイします。

    kubectl apply -f hamster-extra-recommender.yaml
    
  5. [kubectl get]kubectl-get コマンドを使用してポッドを監視します。

    kubectl get --watch pods -l app=hamster
    
  6. 新しい hamster ポッドが起動すると、kubectl describe コマンドを使用して、更新された CPU とメモリの予約が表示されます。 <example-pod> はお使いのいずれかのポッド ID に置き換えてください。

    kubectl describe pod hamster-<example-pod>
    

    出力は次の出力例のようになります。

    State:          Running
      Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    
  7. kubectl describe コマンドを使用して、VPA から更新された推奨事項を表示します。

    kubectl describe vpa/hamster-vpa
    

    出力は次の出力例のようになります。

    State:          Running
     Started:      Wed, 28 Sep 2022 15:09:51 -0400
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        587m
      memory:     262144k
    Environment:  <none>
    Spec:
      recommenders:
        Name: customized-recommender
    

Vertical Pod Autoscaler をトラブルシューティングする

Vertical Pod Autoscaler で問題が発生した場合は、システム コンポーネントとカスタム リソース定義のトラブルシューティングを行うことで問題を特定できます。

  1. 次のコマンドを使用して、すべてのシステム コンポーネントが実行されているかどうかを確認します。

    kubectl --namespace=kube-system get pods|grep vpa
    

    出力には、"3 つのポッド" (レコメンダー、アップデーター、アドミッション コントローラー) が一覧表示され、すべてが Running 状態を示すはずです。

  2. 前の出力で返された各ポッドに対して、次のコマンドを使用して、システム コンポーネントがエラーをログに記録していることを確認します。

    kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
    
  3. 次のコマンドを実行して、カスタム リソース定義が作成されたことを確認します。

    kubectl get customresourcedefinition | grep verticalpodautoscalers
    

次のステップ

VPA オブジェクトの詳細については、「Vertical Pod Autoscaler API リファレンス」を参照してください。