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 ミリコアを要求するようにポッドを更新します。
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"
kubectl apply
コマンドを使用して、hamster.yaml
Vertical Pod Autoscaler の例をデプロイします。kubectl apply -f hamster.yaml
数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。
kubectl get
コマンドを使用して、実行中のポッドを表示します。kubectl get pods -l app=hamster
出力は次の出力例のようになります。
hamster-78f9dcdd4c-hf7gk 1/1 Running 0 24s hamster-78f9dcdd4c-j9mc7 1/1 Running 0 24s
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 では更新された値でポッドを再起動します。
kubectl get
コマンドを使用して、ポッドを監視します。kubectl get --watch pods -l app=hamster
新しい 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 ではより適切な値で見積もりを修正しました。
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
オブジェクトは、Auto
の updateMode
を使用してポッドにリソース要求を自動的に設定します。 要件とテストに応じて異なる値を設定できます。 この例では、2 つのポッドを含む配置マニフェストを作成してテストします。それぞれが 100 milliCPU と 50 MiB のメモリを要求するコンテナーを実行し、updateMode
を Recreate
に設定します。
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"]
kubectl create
コマンドを使用してポッドを作成します。kubectl create -f azure-autodeploy.yaml
数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。
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
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 とメモリの要求を調整してから、新しいポッドを作成できることを意味します。kubectl apply
コマンドを使用して、マニフェストをクラスターに適用します。kubectl create -f azure-vpa-auto.yaml
数分待ってから、
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
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
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 オブジェクトを構成しています。
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
kubectl apply
コマンドを使用して、extra-recomender.yaml
Vertical Pod Autoscaler の例をデプロイします。kubectl apply -f extra-recommender.yaml
数分後、コマンドが完了し、クラスターに関する情報が JSON 形式で返されます。
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"
controlledResources
にmemory
が指定されていない場合、レコメンダーは OOM イベントに応答しません。 この例では、controlledValues
で CPU のみを設定します。controlledValues
では、RequestsOnly
オプションでコンテナーのリソース要求を更新するか、RequestsAndLimits
オプションでリソース要求と制限の両方を更新するかを選択できます。 既定値はRequestsAndLimits
です。RequestsAndLimits
オプションを使用する場合、要求は実際の使用量に基づいて計算され、制限は現在のポッドの要求と制限の比率に基づいて計算されます。たとえば、2 つの CPU を要求し、CPU を 4 つまでに制限するポッドから開始する場合、VPA は常に制限を要求の 2 倍に設定します。 同じ原則がメモリにも適用されます。
RequestsAndLimits
モードを使用すると、これは最初のアプリケーション リソースの要求と制限のブループリントとして機能します。Auto
モードを使用し、CPU とメモリの両方に対する推奨事項を計算することで、VPA オブジェクトを簡素化できます。kubectl apply
コマンドを使用して、hamster-extra-recomender.yaml
の例をデプロイします。kubectl apply -f hamster-extra-recommender.yaml
[kubectl get
]kubectl-get コマンドを使用してポッドを監視します。kubectl get --watch pods -l app=hamster
新しい 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>
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 で問題が発生した場合は、システム コンポーネントとカスタム リソース定義のトラブルシューティングを行うことで問題を特定できます。
次のコマンドを使用して、すべてのシステム コンポーネントが実行されているかどうかを確認します。
kubectl --namespace=kube-system get pods|grep vpa
出力には、"3 つのポッド" (レコメンダー、アップデーター、アドミッション コントローラー) が一覧表示され、すべてが
Running
状態を示すはずです。前の出力で返された各ポッドに対して、次のコマンドを使用して、システム コンポーネントがエラーをログに記録していることを確認します。
kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
次のコマンドを実行して、カスタム リソース定義が作成されたことを確認します。
kubectl get customresourcedefinition | grep verticalpodautoscalers
次のステップ
VPA オブジェクトの詳細については、「Vertical Pod Autoscaler API リファレンス」を参照してください。
Azure Kubernetes Service