このページでは、垂直 Pod 自動スケーリングを使用して Google Kubernetes Engine(GKE)クラスタ内のコンテナの CPU リクエストとメモリ リクエストを分析して調整する方法について説明します。
コンテナ リソースは、 Google Cloud コンソールから手動でスケールできます。また、VerticalPodAutoscaler
オブジェクトを使用してリソースを分析することや、垂直 Pod 自動スケーリングを使用して自動スケーリングを構成することが可能です。
始める前に
始める前に、次の作業が完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
リソース リクエストを分析する
VerticalPodAutoscaler は、コンテナを自動的に分析し、推奨されるリソース リクエストを提供します。これらのリソース リクエストは、Google Cloud コンソール、Cloud Monitoring、Google Cloud CLI を使用して表示できます。
コンソール
Google Cloud コンソールで推奨されるリソース リクエストを表示するには、少なくとも 24 時間以上前のワークロードをデプロイする必要があります。ワークロードによっては(24 時間以内に作成されたもの、スタンドアロン Pod、Java で作成されたアプリなど)、推奨値がないか、適切ではない場合があります。
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、スケールするワークロードの名前をクリックします。
list [アクション] > [スケール] > [リソース リクエストを編集] をクリックします。
[リソース使用率データの分析] セクションには、[リソース リクエストと上限の調整] セクションで推奨リソース リクエストを作成するために垂直 Pod オートスケーラー コントローラが分析したリソース使用量履歴データが表示されます。
Cloud Monitoring
Cloud Monitoring で推奨されるリソース リクエストを表示するには、既存のワークロードをデプロイしておく必要があります。
Google Cloud コンソールの [Metrics Explorer] ページに移動します。
[構成] をクリックします。
[指標を選択] メニューを開きます。
[リソース] メニューで [Kubernetes スケール] を選択します。
[指標カテゴリ] メニューで、[オートスケーラー] を選択します。
[指標] メニューで、[推奨されるレプリカあたりのリクエスト バイト数] と [推奨されるレプリカあたりのリクエストコア数] を選択します。
[適用] をクリックします。
gcloud CLI
推奨されるリソース リクエストを表示するには、VerticalPodAutoscaler
オブジェクトと Deployment を作成する必要があります。
Standard クラスタの場合は、クラスタに対して垂直 Pod 自動スケーリングを有効にします。Autopilot クラスタの場合、垂直 Pod 自動スケーリングがデフォルトで有効になっています。
gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
CLUSTER_NAME
は、使用するクラスタの名前に置き換えます。次のマニフェストを
my-rec-deployment.yaml
として保存します。apiVersion: apps/v1 kind: Deployment metadata: name: my-rec-deployment spec: replicas: 2 selector: matchLabels: app: my-rec-deployment template: metadata: labels: app: my-rec-deployment spec: containers: - name: my-rec-container image: nginx
このマニフェストには、CPU リクエストやメモリ リクエストがない
Deployment
が記述されています。my-rec-deployment
のcontainers.name
値は、Deployment 内のすべての Pod がVerticalPodAutoscaler
に属していることを指定します。マニフェストをクラスタに適用します。
kubectl create -f my-rec-deployment.yaml
次のマニフェストを
my-rec-vpa.yaml
として保存します。apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-rec-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-rec-deployment updatePolicy: updateMode: "Off"
このマニフェストには
VerticalPodAutoscaler
が記述されています。Off
のupdateMode
値は、Pod が作成されると、垂直 Pod オートスケーラー コントローラがコンテナの CPU とメモリのニーズを分析し、推奨値をリソースのstatus
フィールドに記録することを表します。垂直 Pod 自動スケーリング コントローラは、コンテナを実行するためのリソース リクエストを自動的に更新しません。マニフェストをクラスタに適用します。
kubectl create -f my-rec-vpa.yaml
しばらくしてから、
VerticalPodAutoscaler
を表示します。kubectl get vpa my-rec-vpa --output yaml
出力は次のようになります。
... recommendation: containerRecommendations: - containerName: my-rec-container lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k upperBound: cpu: 7931m memory: 8291500k ...
この出力には、CPU リクエストとメモリ リクエストの推奨値が表示されます。
Pod のリソース リクエストを手動で設定する
Pod リソース リクエストは、 Google Cloud コンソールまたは kubectl を使用して手動で設定できます。コンテナのリソース リクエスト数と上限を設定する際のベスト プラクティスは次のとおりです。
- メモリ: リクエストと上限に対して同じ量のメモリを設定します。
- CPU: リクエストで、独自の SLO に従って、正しい動作を保証するために必要な最小 CPU を指定します。無制限の CPU 上限を設定します。
コンソール
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、スケールするワークロードの名前をクリックします。
list [アクション] > [スケール] > [リソース リクエストを編集] をクリックします。
- [リソース リクエストと上限の調整] セクションには、各コンテナの現在の CPU リクエストとメモリ リクエスト、および推奨される CPU リクエストとメモリ リクエストが表示されます。
各コンテナに対して推奨されるリクエストを表示するには、[最新の提案を適用] をクリックします。
[変更を保存] をクリックします。
[確認] をクリックします。
kubectl
Pod のリソース リクエストを設定するには、Deployment マニフェストで requests.cpu と memory.cpu の値を設定します。この例では、リソース リクエストを分析する で作成した Deployment を手動で変更することをおすすめします。
次のマニフェストの例を
my-adjusted-deployment.yaml
として保存します。apiVersion: apps/v1 kind: Deployment metadata: name: my-rec-deployment spec: replicas: 2 selector: matchLabels: app: my-rec-deployment template: metadata: labels: app: my-rec-deployment spec: containers: - name: my-rec-container image: nginx resources: requests: cpu: 25m memory: 256Mi
このマニフェストには、2 つの Pod を持つ Deployment が記述されています。各 Pod は、CPU リクエストが 25 milliCPU、メモリ リクエストが 256 MiB のコンテナを 1 つずつ持ちます。
マニフェストをクラスタに適用します。
kubectl apply -f my-adjusted-deployment.yaml
次の手順で、変更を手動で適用することもできます。
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、スケールするワークロードの名前をクリックします。
list [アクション] > [スケール] > [リソース リクエストを編集] をクリックします。
コンテナ リクエストを構成します。
[Get Equivalent YAML] をクリックします。
[ワークロードをダウンロード ] をクリックするか、マニフェストをコピーして
resource-adjusted.yaml
という名前のファイルに貼り付けます。マニフェストをクラスタに適用します。
kubectl create -f resource-adjusted.yaml
Pod のリソース リクエストを自動的に設定する
垂直 Pod 自動スケーリングは、updateMode
が Auto
の場合に VerticalPodAutoscaler
オブジェクトを使用して、Pod でリソース リクエストを自動的に設定します。VerticalPodAutoscaler
は、gcloud CLI またはGoogle Cloud コンソールを使用して構成できます。
コンソール
リソース リクエストを自動的に設定するには、垂直 Pod 自動スケーリング機能が有効になっているクラスタが必要です。Autopilot クラスタでは、垂直 Pod 自動スケーリング機能がデフォルトで有効になっています。
垂直 Pod 自動スケーリングを有効にする
Google Cloud コンソールで [Google Kubernetes Engine] ページに移動します。
クラスタのリストで、変更するクラスタの名前をクリックします。
[自動化] セクションで、[edit垂直 Pod 自動スケーリング] オプションの [編集] をクリックします。
[垂直 Pod 自動スケーリングを有効にする] チェックボックスをオンにします。
[変更を保存] をクリックします。
垂直 Pod 自動スケーリングを構成する
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、垂直 Pod 自動スケーリングを構成する Deployment の名前をクリックします。
list [操作] > [自動スケーリング] > [垂直 Pod 自動スケーリング] の順にクリックします。
自動スケーリング モードを選択します。
- [自動] モード: 垂直 Pod 自動スケーリングは、Pod のライフサイクル期間中に CPU リクエストとメモリ リクエストを更新します。
- [初期] モード: 垂直 Pod 自動スケーリングは、Pod の作成時にのみリソース リクエストを割り当て、後で変更することはありません。
(省略可)コンテナ ポリシーを設定します。このオプションを使用すると、推奨値が指定したリソース リクエストの量を上回ることも、下回ることもなくなります。
- expand_more[ポリシーを追加] をクリックします。
- [Edit container mode] で [自動] を選択します。
- [制御対象リソース] で、コンテナを自動スケーリングするリソースを選択します。
- [ルールを追加] をクリックして、コンテナのリソース リクエストの最小範囲または最大範囲を設定します。
- 許容最小メモリ: コンテナに常に必要な最小メモリ量(MiB 単位)。
- 許容最小 CPU: コンテナに常に必要な最小 CPU 数(mCPU 単位)。
- 許容最大メモリ: コンテナが常に保持する必要がある最大メモリ量(MiB 単位)。
- 許容最大 CPU: コンテナで常に使用する最大 CPU 数(mCPU 単位)。
[完了] をクリックします。
[保存] をクリックします。
gcloud
リソース リクエストを自動的に設定するには、垂直 Pod 自動スケーリング機能が有効になっているクラスタを使用する必要があります。Autopilot クラスタではこの機能がデフォルトで有効になっています。
Standard クラスタの場合は、クラスタで垂直 Pod 自動スケーリングを有効にします。
gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
CLUSTER_NAME
は、使用するクラスタの名前に置き換えます。次のマニフェストを
my-auto-deployment.yaml
として保存します。apiVersion: apps/v1 kind: Deployment metadata: name: my-auto-deployment spec: replicas: 2 selector: matchLabels: app: my-auto-deployment template: metadata: labels: app: my-auto-deployment spec: containers: - name: my-container image: registry.k8s.io/ubuntu-slim:0.14 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 つの Pod を持つ Deployment が記述されています。各 Pod は、CPU リクエストが 100 milliCPU、メモリ リクエストが 50 MiB のコンテナを 1 つずつ持ちます。
マニフェストをクラスタに適用します。
kubectl create -f my-auto-deployment.yaml
次のようにして、実行中の Pod のリストを表示します。
kubectl get pods
出力に、
my-deployment
内の Pod の名前が表示されます。NAME READY STATUS RESTARTS AGE my-auto-deployment-cbcdd49fb-d6bf9 1/1 Running 0 8s my-auto-deployment-cbcdd49fb-th288 1/1 Running 0 8s
次のマニフェストを
my-vpa.yaml
として保存します。apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-auto-deployment updatePolicy: updateMode: "Auto"
このマニフェストでは、次のプロパティを持つ
VerticalPodAutoscaler
が記述されています。targetRef.name
:my-deployment
という名前の Deployment によって制御される Pod がこのVerticalPodAutoscaler
に属することを指定します。updateMode: Auto
: VerticalPodAutoscaler コントローラが Pod を削除し、CPU リクエストとメモリ リクエストを調整して、新しい Pod を起動できることを指定します。
updateMode: "Initial"
を使用して、Pod の作成時にのみリソース リクエストを割り当てるように垂直 Pod 自動スケーリングを構成することもできます。マニフェストをクラスタに適用します。
kubectl create -f my-vpa.yaml
数分待ってから、次のようにして実行中の Pod を再度表示します。
kubectl get pods
出力には、Pod 名が変更されたことが示されます。
NAME READY STATUS RESTARTS AGE my-auto-deployment-89dc45f48-5bzqp 1/1 Running 0 8s my-auto-deployment-89dc45f48-scm66 1/1 Running 0 8s
Pod 名が変更されていない場合は、さらに少し待ってから、実行中の Pod を再度表示します。
VerticalPodAutoscaler に関する情報を表示する
VerticalPodAutoscaler の詳細を表示するには、次のようにします。
次のようにして、実行中の Pod の詳細情報を取得します。
kubectl get pod POD_NAME --output yaml
POD_NAME
を前のステップで取得したいずれかの Pod の名前に置き換えます。出力は次のようになります。
apiVersion: v1 kind: Pod metadata: annotations: vpaUpdates: 'Pod resources updated by my-vpa: container 0: cpu capped to node capacity, memory capped to node capacity, cpu request, memory request' ... spec: containers: ... resources: requests: cpu: 510m memory: 262144k ...
この出力は、垂直 Pod オートスケーラー コントローラのメモリ リクエストが 262,144k で、CPU リクエストが 510 milliCPU であることを示しています。
VerticalPodAutoscaler
に関する詳細情報を取得します。kubectl get vpa my-vpa --output yaml
出力は次のようになります。
... recommendation: containerRecommendations: - containerName: my-container lowerBound: cpu: 536m memory: 262144k target: cpu: 587m memory: 262144k upperBound: cpu: 27854m memory: "545693548"
この出力には、CPU リクエストとメモリ リクエストの推奨値が示され、次のプロパティが含まれています。
target
: コンテナが最適に動作するように、587 milliCPU と 262,144 KB のメモリをリクエストするよう指定します。lowerBound
とupperBound
: 垂直 Pod 自動スケーリングはこれらのプロパティを使用して、Pod を削除して新しい Pod に置き換えるかどうかを決定します。Pod が下限より小さい、または上限より大きいリクエストを有する場合、VerticalPodAutoscaler はその Pod を削除し、ターゲット属性を有する Pod に置き換えます。
特定のコンテナを無効にする
垂直 Pod 自動スケーリングから特定のコンテナをオプトアウトするには、gcloud CLI または Google Cloud コンソールを使用します。
コンソール
垂直 Pod 自動スケーリングから特定のコンテナをオプトアウトするには、垂直 Pod 自動スケーリング機能が有効になっているクラスタが必要です。Autopilot クラスタでは、垂直 Pod 自動スケーリング機能がデフォルトで有効になっています。
垂直 Pod 自動スケーリングを有効にする
Google Cloud コンソールで [Google Kubernetes Engine] ページに移動します。
クラスタのリストで、変更するクラスタの名前をクリックします。
[自動化] セクションで、[edit垂直 Pod 自動スケーリング] オプションの [編集] をクリックします。
[垂直 Pod 自動スケーリングを有効にする] チェックボックスをオンにします。
[変更を保存] をクリックします。
垂直 Pod 自動スケーリングを構成する
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、垂直 Pod 自動スケーリングを構成する Deployment の名前をクリックします。
list [操作] > [自動スケーリング] > [垂直 Pod 自動スケーリング] の順にクリックします。
自動スケーリング モードを選択します。
- [自動] モード: 垂直 Pod 自動スケーリングは、Pod のライフサイクル期間中に CPU リクエストとメモリ リクエストを更新します。
- [初期] モード: 垂直 Pod 自動スケーリングは、Pod の作成時にのみリソース リクエストを割り当て、後で変更することはありません。
expand_more[ポリシーを追加] をクリックします。
オプトアウトするコンテナを選択します。
[Edit container mode] で [オフ] を選択します。
[完了] をクリックします。
[保存] をクリックします。
gcloud
垂直 Pod 自動スケーリングから特定のコンテナをオプトアウトするには、次の手順を行います。
次のマニフェストを
my-opt-vpa.yaml
として保存します。apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-opt-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-opt-deployment updatePolicy: updateMode: "Auto" resourcePolicy: containerPolicies: - containerName: my-opt-sidecar mode: "Off"
このマニフェストには
VerticalPodAutoscaler
が記述されています。mode: "Off"
値は、コンテナmy-opt-sidecar
の推奨値をオフにします。マニフェストをクラスタに適用します。
kubectl apply -f my-opt-vpa.yaml
次のマニフェストを
my-opt-deployment.yaml
として保存します。apiVersion: apps/v1 kind: Deployment metadata: name: my-opt-deployment spec: replicas: 1 selector: matchLabels: app: my-opt-deployment template: metadata: labels: app: my-opt-deployment spec: containers: - name: my-opt-container image: nginx - name: my-opt-sidecar image: busybox command: ["sh","-c","while true; do echo Doing sidecar stuff!; sleep 60; done"]
マニフェストをクラスタに適用します。
kubectl apply -f my-opt-deployment.yaml
しばらくして、VerticalPodAutoscaler を表示します。
kubectl get vpa my-opt-vpa --output yaml
出力に、CPU リクエストとメモリ リクエストの推奨値が表示されます。
... recommendation: containerRecommendations: - containerName: my-opt-container ...
この出力では、1 つのコンテナの推奨値のみが示されています。
my-opt-sidecar
に対する推奨値はありません。垂直 Pod オートスケーラーによって、無効にされたコンテナのリソースが更新されることはありません。数分待つと Pod が再作成されますが、リソース リクエストが更新されるのは 1 つのコンテナのみです。
リソース リクエストまたは上限のないワークロードを特定する
GKE では、ノードのリソースが不足した場合の Pod の突然の終了を回避し、費用の割り当ての精度を高めるために、すべてのワークロードにリソース リクエストと上限を設定することをベスト プラクティスとして推奨しています。そのため、リソース リクエストと上限が構成されていないワークロードを特定することをおすすめします。BestEffort Pod または Burstable メモリを持つ Pod を定義すると、ノードでメモリ不足が発生したときに信頼性の問題が発生する可能性があります。コンテナのリソース リクエスト数と上限を設定する際のベスト プラクティスは次のとおりです。
- メモリ: リクエストと上限に対して同じ量のメモリを設定します。
- CPU: リクエストで、独自の SLO に従って、正しい動作を保証するために必要な最小 CPU を指定します。無制限の CPU 上限を設定します。
GKE は、リソース リクエストと上限なしで実行されているワークロードの分析情報と推奨事項を生成します。
次の表に、GKE が検出するリソース構成シナリオと、各シナリオの条件を示します。
分析情報のサブタイプ | 設定が見つからないシナリオ | 詳細 |
---|---|---|
REQUEST_OR_LIMIT_NOT_SET |
メモリ リクエストと上限が構成されていません。(MEMORY_REQUEST_AND_LIMIT_NOT_SET )
|
コンテナでメモリのリクエストと上限が設定されずに Pod が実行されています。GKE はメモリ使用量をスロットリングできないため、ノードでメモリ不足が発生すると、このような Pod を突然終了する可能性があります。これにより、信頼性の問題が発生する可能性があります。 |
REQUEST_OR_LIMIT_NOT_SET |
メモリ上限が構成されていません。(MEMORY_LIMIT_NOT_SET )
|
コンテナでメモリの上限が設定されずに Pod が実行されています。GKE はメモリ使用量をスロットリングできません。ノードでメモリ不足が発生し、Pod のメモリ使用量がリクエストを超えると、Pod が突然終了して、信頼性の問題が発生する可能性があります。リクエストと上限に対して同じ量のメモリを設定して、Pod がリクエストされた量よりも多くのメモリを使用しないようにする必要があります。 |
REQUEST_OR_LIMIT_NOT_SET |
CPU のリクエストと上限が構成されていません。(CPU_REQUEST_AND_LIMIT_NOT_SET )
|
コンテナで CPU のリクエストと上限が設定されずに Pod が実行されているため、ノードのリソースが枯渇する可能性が高くなります。このため、ノードの CPU 使用率がその上限に近づくと Pod がスロットリングされやすくなり、パフォーマンスの問題が発生するおそれがあります。 |
これらの分析情報の詳細については、分析情報と推奨事項を表示する手順沿って操作してください。
リソース リクエストと上限を手動で確認する
推奨に従って構成を更新できるように、特定のワークロードでリソース リクエストと上限が不足しているか、指定する必要があるかを手動で確認することをおすすめします。
指定したワークロードのリソース リクエストと上限の構成を確認または更新するには、次の操作を行います。
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、検査するワークロードの名前をクリックします。
list [アクション] > [スケール] > [リソース リクエストを編集] をクリックします。
- [リソース リクエストと上限の調整] セクションには、各コンテナの現在の CPU リクエストとメモリ リクエストが表示されます。
次のステップ
- 垂直 Pod 自動スケーリングの詳細を確認する。
- コストが最適化された Kubernetes アプリケーションを GKE で実行するためのベスト プラクティスについて確認する。
- 分析情報と推奨事項で GKE の使用を最適化する方法を確認する。