このページでは、Google Kubernetes Engine クラスタで垂直ポッド自動スケーリングを構成する方法について説明します。垂直ポッド自動スケーリングでは、ポッドの CPU リクエストおよびメモリ リクエストの調整を行います。
概要
VerticalPodAutoscaler
カスタム リソースを使用して、コンテナの CPU リクエストとメモリ リクエストを分析および調整できます。VerticalPodAutoscaler
は、CPU リクエストとメモリ リクエストの値を推奨するように構成できます。また、それらの値を自動的に更新するように構成することもできます。
始める前に
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API が有効になっていることを確認します。 Google Kubernetes Engine API の有効化
- Cloud SDK がインストール済みであることを確認します。
次のいずれかの方法で gcloud
のデフォルトの設定を指定します。
gcloud init
。デフォルトの設定全般を確認する場合に使用します。gcloud config
。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。
gcloud init の使用
エラー One of [--zone, --region] must be supplied: Please specify
location
を受信した場合は、このセクションの内容を実施します。
-
gcloud init
を実行して、次の操作を行います。gcloud init
リモート サーバーで SSH を使用している場合は、
--console-only
フラグを指定して、コマンドがブラウザを起動しないようにします。gcloud init --console-only
- 手順に従って
gcloud
を承認し、Google Cloud アカウントを使用します。 - 新しい構成を作成するか、既存の構成を選択します。
- Google Cloud プロジェクトを選択します。
- デフォルトの Compute Engine ゾーンを選択します。
gcloud config の使用
- デフォルトのプロジェクト ID を設定します。
gcloud config set project project-id
- ゾーンクラスタを使用する場合は、デフォルトのコンピューティング ゾーンを設定します。
gcloud config set compute/zone compute-zone
- リージョン クラスタを使用する場合は、デフォルトのコンピューティング リージョンを設定します。
gcloud config set compute/region compute-region
gcloud
を最新バージョンに更新します。gcloud components update
API バージョンに関する注意
このガイドでは、v1 バージョンの VerticalPodAutoscaler API が Google Kubernetes Engine クラスタにインストールされていることを前提としています。これは、バージョン 1.14.7-gke.10 以降と 1.15.4-gke.15 以降で使用できます。
ぜひこの API をご利用ください。以前の API バージョンから移行する手順については、移行ガイドをご覧ください。
クラスタの垂直ポッド自動スケーリングを有効にする
垂直ポッド自動スケーリングを有効にして新しいクラスタを作成するには、次のコマンドを入力します。
gcloud container clusters create cluster-name \
--enable-vertical-pod-autoscaling --cluster-version=1.14.7
ここで、cluster-name はクラスタに付ける名前です。
既存のクラスタに対して垂直ポッド自動スケーリングを有効にするには、次のコマンドを入力します。
gcloud container clusters update cluster-name --enable-vertical-pod-autoscaling
ここで、cluster-name はクラスタ名です。
垂直 Pod 自動スケーリングを有効または無効にすると、コントロール プレーンが再起動します。
リソースの推奨値を取得する
この演習では、updateMode
が「Off」の VerticalPodAutoscaler
オブジェクトを作成します。次に、Pod を 2 つ持つ Deployment を作成します。各 Pod にはコンテナが 1 つずつあります。Pod が作成されると、VerticalPodAutoscaler
はコンテナの CPU とメモリのニーズを分析し、推奨値を status
フィールドに記録します。VerticalPodAutoscaler
は、実行中のコンテナのリソース リクエストを更新するアクションは行いません。
VerticalPodAutoscaler
のマニフェストは次のとおりです。
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"
このマニフェストを my-rec-vpa.yaml
という名前のファイルに保存して、VerticalPodAutoscaler
を作成します。
kubectl create -f my-rec-vpa.yaml
Deployment のマニフェストは次のとおりです。
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 の Pod が VerticalPodAutoscaler
に属していることもわかります。なぜなら、Pod が指しているターゲットが kind: Deployment
と name: my-rec-deployment
であるからです。
このマニフェストを my-rec-deployment.yaml
という名前のファイルにコピーし、次のようにして Deployment を作成します。
kubectl create -f my-rec-deployment.yaml
少し待ってから、次のようにして VerticalPodAutoscaler
を表示します。
kubectl get vpa my-rec-vpa --output yaml
出力に、CPU リクエストとメモリ リクエストの推奨値が表示されます。
...
recommendation:
containerRecommendations:
- containerName: my-rec-container
lowerBound:
cpu: 25m
memory: 262144k
target:
cpu: 25m
memory: 262144k
upperBound:
cpu: 7931m
memory: 8291500k
...
CPU リクエストとメモリ リクエストの推奨値が得られたので、Deployment を削除し、CPU リクエストとメモリ リクエストを Deployment マニフェストに追加して、Deployment を再起動することもできます。
特定のコンテナを無効にする
この演習では、特定のコンテナが無効になっている VerticalPodAutoscaler
を作成します。次に、1 つの Pod と 2 つのコンテナを持つ Deployment を作成します。Pod の作成時に、VerticalPodAutoscaler
は 1 つのコンテナに対してのみ推奨値を作成して適用し、無効になっているコンテナは無視します。
VerticalPodAutoscaler
のマニフェストは次のとおりです。
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
は、resourcePolicy
セクションに追加情報があります。mode "Off"
は指定した名前のコンテナ、この場合は my-opt-sidecar
の推奨値をオフにします。
このマニフェストを my-opt-vpa.yaml
という名前のファイルに保存して、VerticalPodAutoscaler
を作成します。
kubectl create -f my-opt-vpa.yaml
Deployment のマニフェストは次のとおりです。
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"]
このマニフェストを my-opt-deployment.yaml
という名前のファイルにコピーし、次のようにして Deployment を作成します。
kubectl create -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
の推奨値はありません。
VerticalPodAutoscaler
によって、無効にされたコンテナのリソースが更新されることはありません。数分待つと Pod が再作成されますが、リソース リクエストが更新されるのは 1 つのコンテナのみです。
リソース リクエストを自動的に更新する
この演習では、ポッドを 2 つ持つ Deployment を作成します。各 Pod は、CPU リクエストが 100 milliCPU、メモリ リクエストが 50 MiB のコンテナを 1 つずつ持ちます。次に、CPU リクエストとメモリ リクエストを自動的に調整する VerticalPodAutoscaler
を作成します。
Deployment のマニフェストは次のとおりです。
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"]
このマニフェストを my-auto-deployment.yaml
という名前のファイルにコピーし、次のようにして Deployment を作成します。
kubectl create -f my-auto-deployment.yaml
次のようにして、実行中のポッドのリストを表示します。
kubectl get pods
出力に、my-deployment
内のポッドの名前が表示されます。
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
後で使用できるように、ポッド名をメモします。
Deployment の CPU リクエストとメモリ リクエストは非常に小さいため、リソースの増加は Deployment にメリットをもたらす可能性があります。
VerticalPodAutoscaler
のマニフェストは次のとおりです。
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"
このマニフェストの targetRef
フィールドは、my-deployment
という名前の Deployment によって制御されるすべての Pod が、この VerticalPodAutoscaler
に属することを示しています。
updateMode
フィールドの値は Auto
ですが、これは VerticalPodAutoscaler
が Pod のライフサイクル期間中に CPU リクエストおよびメモリ リクエストを更新できるという意味です。つまり、VerticalPodAutoscaler
は Pod を削除し、CPU リクエストとメモリ リクエストを調整して、新しい Pod を開始できるということです。
このマニフェストを my-vpa.yaml
という名前のファイルにコピーして VerticalPodAutoscaler
を作成します。
kubectl create -f my-vpa.yaml
数分待ってから、次のようにして実行中の Pod を再度表示します。
kubectl get pods
ポッド名が変更されていることを確認します。ポッド名がまだ変更されていない場合は、さらに少し待ってから、実行中のポッドを再度表示します。
次のようにして、実行中のポッドの詳細情報を取得します。
kubectl get pod pod-name --output yaml
ここで、pod-name は Pod 名です。
出力から、VerticalPodAutoscaler
によってメモリ リクエストと CPU リクエストが増えたことがわかります。また、更新について記録したアノテーションを確認することもできます。
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
...
VerticalPodAutoscaler
に関する詳細情報を取得します。
kubectl get vpa my-vpa --output yaml
出力に、CPU リクエストとメモリ リクエストの推奨値が 3 セット(下限、ターゲット、上限)示されます。
...
recommendation:
containerRecommendations:
- containerName: my-container
lowerBound:
cpu: 536m
memory: 262144k
target:
cpu: 587m
memory: 262144k
upperBound:
cpu: 27854m
memory: "545693548"
target
推奨値は、コンテナが 587 milliCPU と 262,144 KB のメモリをリクエストする場合に、コンテナの動作が最適化されることを示しています。
VerticalPodAutoscaler
は、lowerBound
推奨値と upperBound
推奨値に基づいて、Pod を削除して新しい Pod に置き換えるかどうかを決定します。Pod が下限より小さい、または上限より大きいリクエストを有する場合、VerticalPodAutoscaler
はその Pod を削除し、ターゲット推奨値を有する Pod に置き換えます。
クリーンアップ
垂直 Pod 自動スケーリングを無効にします。
gcloud container clusters update cluster-name --no-enable-vertical-pod-autoscaling
ここで、cluster-name はクラスタ名です。
必要に応じて、クラスタを削除します。
次のステップ
- 垂直 Pod 自動スケーリングの詳細を学習する。
- コンテナと Pod に CPU リソースを割り当てる方法を学習する。
- コンテナと Pod にメモリリソースを割り当てる方法を学習する。
- アプリケーションのスケーリングについて学習する。
- カスタム指標に基づく Deployment の自動スケーリングについて学習する。
- クラスタ オートスケーラーについて学習する。
- 多次元 Pod オートスケーラーについて学習する。