垂直ポッド自動スケーリングの構成

このページでは、Google Kubernetes Engine クラスタで垂直ポッド自動スケーリングを構成する方法について説明します。垂直ポッド自動スケーリングでは、ポッドの CPU リクエストおよびメモリ リクエストの調整を行います。

概要

VerticalPodAutoscaler カスタム リソースを使用して、コンテナの CPU リクエストメモリ リクエストを分析および調整できます。VerticalPodAutoscaler は、CPU リクエストとメモリ リクエストの値を推奨するように構成できます。また、それらの値を自動的に更新するように構成することもできます。

始める前に

作業を始める前に、次のことを確認してください。

次のいずれかの方法で gcloud のデフォルトの設定を指定します。

  • gcloud init。デフォルトの設定全般を確認する場合に使用します。
  • gcloud config。プロジェクト ID、ゾーン、リージョンを個別に設定する場合に使用します。

gcloud init の使用

エラー One of [--zone, --region] must be supplied: Please specify location を受信した場合は、このセクションの内容を実施します。

  1. gcloud init を実行して、次の操作を行います。

    gcloud init

    リモート サーバーで SSH を使用している場合は、--console-only フラグを指定して、コマンドがブラウザを起動しないようにします。

    gcloud init --console-only
  2. 手順に従って gcloud を承認し、Google Cloud アカウントを使用します。
  3. 新しい構成を作成するか、既存の構成を選択します。
  4. Google Cloud プロジェクトを選択します。
  5. デフォルトの 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 はクラスタ名です。

リソースの推奨値を取得する

この演習では、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: Deploymentname: 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 に置き換えます。

次のステップ