このページでは、垂直 Pod 自動スケーリングを使用して Google Kubernetes Engine(GKE)クラスタ内のコンテナの CPU リクエストとメモリ リクエストを分析して調整する方法について説明します。
コンテナ リソースは、Google Cloud コンソールまたは VerticalPodAutoscaler
オブジェクトを使用して手動でスケーリングできます。また、垂直 Pod 自動スケーリングを使用して自動スケーリングを構成することもできます。
リソース リクエストのベスト プラクティスについて詳しくは、Kubernetes のベスト プラクティス: リソース リクエストと上限をご覧ください。
Autopilot クラスタの場合、垂直 Pod 自動スケーリングがデフォルトで有効になっています。
準備
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API が有効になっていることを確認します。 Google Kubernetes Engine API の有効化
- Google Cloud CLI がインストールされていることを確認します。
- 次のいずれかの方法で、プロジェクトにデフォルトの Google Cloud CLI 設定をセットアップします。
- プロジェクトのデフォルトの設定全般を確認する場合は、
gcloud init
を使用します。 gcloud config
を使用して、プロジェクト ID、ゾーン、リージョンを個別に設定します。-
gcloud init
を実行して、次の操作を行います。gcloud init
リモート サーバーで SSH を使用している場合は、
--console-only
フラグを指定して、コマンドがブラウザを起動しないようにします。gcloud init --console-only
- Google Cloud アカウントを使用できるように、gcloud CLI の承認手順を行います。
- 新しい構成を作成するか、既存の構成を選択します。
- Google Cloud プロジェクトを選択します。
- デフォルトの Compute Engine ゾーンを選択します。
- デフォルトの Compute Engine リージョンを選択します。
- デフォルトのプロジェクト ID を設定します。
gcloud config set project PROJECT_ID
- デフォルトの Compute Engine リージョン(例:
us-central1
)を設定します。gcloud config set compute/region COMPUTE_REGION
- デフォルトの Compute Engine ゾーン(例:
us-central1-c
)を設定します。gcloud config set compute/zone COMPUTE_ZONE
gcloud
を最新バージョンに更新します。gcloud components update
gcloud init
gcloud config
デフォルトの場所を設定することで、gcloud CLI のエラー(One of [--zone, --region] must be supplied: Please specify location
など)を防止できます。
リソース リクエストを分析する
垂直 Pod オートスケーラーはコンテナを自動的に分析し、推奨されるリソース リクエストを提供します。これらのリソース リクエストは、Cloud Console、Cloud Monitoring、Google Cloud CLI を使用して表示できます。
Console
Cloud コンソールで推奨されるリソース リクエストを表示するには、少なくとも 24 時間以上前のワークロードをデプロイする必要があります。
Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、スケールするワークロードの名前をクリックします。
list [アクション] > [スケール] > [リソース リクエストの編集] をクリックします。
リソース使用率データの分析セクションには、垂直 Pod オートスケーラー コントローラが分析したリソース使用量履歴データが表示されます。これは、リソース リクエストと上限を調整するセクションで推奨リソース リクエストを作成するために作成されています。
Cloud Monitoring
Cloud Monitoring で推奨されるリソース リクエストを表示するには、既存のワークロードをデプロイする必要があります。
Cloud コンソールの [Metrics Explorer] ページに移動します。
[構成] をクリックします。
[指標を選択] メニューを開きます。
[リソース] メニューで [Kubernetes スケール] を選択します。
[指標カテゴリ] メニューで、[オートスケーラー] を選択します。
[指標] メニューで、[推奨されるレプリカあたりのリクエスト バイト数] を選択します。
[適用] をクリックします。
gcloud CLI
推奨されるリソース リクエストを表示するには、VerticalPodAutoscaler
オブジェクトと Deployment を作成する必要があります。
クラスタの垂直 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
が記述されています。[updateMode
-Off
垂直 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 または Cloud コンソールを使用して手動で設定できます。
Console
Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、スケールするワークロードの名前をクリックします。
list [アクション] > [スケール] > [リソース リクエストの編集] をクリックします。
- [リソース リクエストと制限の調整] セクションには、各コンテナの現在の CPU リクエストとメモリ リクエスト、および推奨される CPU リクエストとメモリ リクエストが表示されます。
[最新の候補を適用] をクリックして、各コンテナに対して提案されたリクエストを表示します。
[Save Changes] をクリックします。
[確認] をクリックします。
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
このマニフェストには、Pod を 2 つ持つ Deployment が記述されています。各 Pod は、CPU リクエストが 25 milliCPU、メモリ リクエストが 256 MiB のコンテナを 1 つずつ持ちます。
マニフェストをクラスタに適用します。
kubectl apply -f my-adjusted-deployment.yaml
次の手順で、手動で変更を適用することもできます。
Cloud コンソールの [ワークロード] ページに移動します。
ワークロード リストで、スケールするワークロードの名前をクリックします。
コンテナ リクエストを構成します。
[同等の YAML を取得] をクリックします。
リソース リクエストを適用するコンテナを選択します。
[Deployment をダウンロード] をクリックするか、マニフェストをコピーして
resource-adjusted.yaml
という名前のファイルに貼り付けます。マニフェストをクラスタに適用します。
kubectl create -f resource-adjusted.yaml
Pod のリソース リクエストを自動的に設定する
垂直 Pod 自動スケーリングは、updateMode
が "Auto"
の場合に VerticalPodAutoscaler
オブジェクトを使用して、Pod のリソース リクエストを自動的に設定します。
クラスタの垂直 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: 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"]
このマニフェストには、Pod を 2 つ持つ Deployment が記述されています。各 Pod は、CPU リクエストが 100 milliCPU、メモリ リクエストが 50 MiB のコンテナを 1 つずつ持ちます。
マニフェストをクラスタに適用します。
kubectl create -f my-auto-deployment.yaml
次のようにして、実行中のポッドのリストを表示します。
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
であることは、垂直 Pod オートスケーラー コントローラが Pod を削除し、CPU リクエストとメモリ リクエストを調整して、新しい Pod を起動できることを表します。updateMode: "Initial"
を使用して、Pod の作成時にのみリソース リクエストを割り当てるように垂直 Pod 自動スケーリングを構成することもできます。マニフェストをクラスタに適用します。
kubectl create -f my-vpa.yaml
数分待ってから、次のようにして実行中のポッドを再度表示します。
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 を再度表示します。
次のようにして、実行中のポッドの詳細情報を取得します。
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 のメモリをリクエストするよう指定します。垂直 Pod オートスケーラーは、
lowerBound
属性とupperBound
属性に基づいて、Pod を削除して新しい Pod に置き換えるかどうかを決定します。Pod が下限より小さい、または上限より大きいリクエストを有する場合、垂直 Pod オートスケーラーはその Pod を削除し、ターゲット属性を有する Pod に置き換えます。
特定のコンテナを無効にする
この演習では、特定のコンテナが無効にされた VerticalPodAutoscaler
オブジェクトを作成します。次に、1 つの Pod と 2 つのコンテナを持つ Deployment を作成します。Pod の作成時に、垂直 Pod オートスケーラーは 1 つのコンテナに対してのみ推奨値を作成して適用し、無効になっているコンテナは無視します。
次のマニフェストを
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
しばらくして、垂直 Pod オートスケーラーを表示します。
kubectl get vpa my-opt-vpa --output yaml
出力に、CPU リクエストとメモリ リクエストの推奨値が表示されます。
... recommendation: containerRecommendations: - containerName: my-opt-container ...
1 つのコンテナにのみ推奨値があります。
my-opt-sidecar
に対する推奨値はありません。垂直 Pod オートスケーラーによって、無効にされたコンテナのリソースが更新されることはありません。数分待つと Pod が再作成されますが、リソース リクエストが更新されるのは 1 つのコンテナのみです。
クリーンアップ
このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。
クラスタで垂直 Pod 自動スケーリングを無効にします。
gcloud container clusters update CLUSTER_NAME --no-enable-vertical-pod-autoscaling
CLUSTER_NAME
はクラスタの名前で置き換えます。必要に応じて、クラスタを削除できます。
次のステップ
- 垂直 Pod 自動スケーリングの詳細を確認する。
- コストが最適化された Kubernetes アプリケーションを GKE で実行するためのベスト プラクティスについて確認する。
- コンテナと Pod に CPU リソースを割り当てる方法を確認する。
- コンテナと Pod にメモリリソースを割り当てる方法を確認する。