このページでは、垂直 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
を実行して最新のバージョンを取得する。
リソース リクエストを分析する
垂直 Pod 自動スケーリングは、コンテナを自動的に分析し、推奨されるリソース リクエストを提供します。これらのリソース リクエストは、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 CLI または Google Cloud コンソールを使用して手動で設定できます。
コンソール
Google Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、スケールするワークロードの名前をクリックします。
list [アクション] > [スケール] > [リソース リクエストを編集] をクリックします。
- [リソース リクエストと上限の調整] セクションには、各コンテナの現在の CPU リクエストとメモリ リクエスト、および推奨される CPU リクエストとメモリ リクエストが表示されます。
各コンテナに対して推奨されるリクエストを表示するには、[最新の提案を適用] をクリックします。
[変更を保存] をクリックします。
[確認] をクリックします。
gcloud
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.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 つの 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 つのコンテナのみです。
次のステップ
- 垂直 Pod 自動スケーリングの詳細を確認する。
- コストが最適化された Kubernetes アプリケーションを GKE で実行するためのベスト プラクティスについて確認する。
- コンテナと Pod に CPU リソースを割り当てる方法を学習する。
- コンテナと Pod にメモリリソースを割り当てる方法を学習する。