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

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

概要

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

始める前に

このタスクの準備として、次の手順を行います。

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Google Kubernetes Engine API の有効化
  • Cloud SDK がインストール済みであることを確認します。
  • デフォルトのプロジェクト 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 バージョンに関する注意

このガイドでは、Google Kubernetes Engine クラスタに v1beta2 バージョンの Vertical Pod Autoscaler API がインストールされていることを前提としています。これはバージョン 1.11.8 以降で使用できます。

ぜひこの API をご利用ください。以前の API バージョンから移行する手順については、移行ガイドをご覧ください。

クラスタの垂直ポッド自動スケーリングを有効にする

垂直ポッド自動スケーリングを有効にして新しいクラスタを作成するには、次のコマンドを入力します。

gcloud beta container clusters create [CLUSTER_NAME] --enable-vertical-pod-autoscaling

ここで、[CLUSTER_NAME] はクラスタに付ける名前です。

既存のクラスタに対して垂直ポッド自動スケーリングを有効にするには、次のコマンドを入力します。

cloud beta container clusters update [CLUSTER-NAME] --enable-vertical-pod-autoscaling

ここで、[CLUSTER_NAME] はクラスタ名です。

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

この演習では、updateMode が「Off」の VerticalPodAutoscaler を作成します。次に、ポッドを 2 つ持つ Deployment を作成します。各ポッドにはコンテナが 1 つずつあります。ポッドが作成されると、VerticalPodAutoscaler はコンテナの CPU とメモリのニーズを分析し、推奨値を status フィールドに記録します。VerticalPodAutoscaler は、実行中のコンテナのリソース リクエストを更新するアクションは行いません。

VerticalPodAutoscaler のマニフェストは次のとおりです。

apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscaler
metadata:
  name: my-rec-vpa
spec:
  targetRef:
    apiVersion: "extensions/v1beta1"
    kind:       Deployment
    name:       my-rec-deployment
  updatePolicy:
    updateMode: "Off"

このマニフェストを my-rec-vpa.yaml という名前のファイルに保存して、VerticalPodAutoscaler を作成します。

kubectl create -f my-rec-vpa.yaml

Deployment のマニフェストは次のとおりです。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-rec-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: my-rec-deployment
    spec:
      containers:
      - name: my-rec-container
        image: nginx

このマニフェストには、CPU リクエストやメモリ リクエストがないことがわかります。また、Deployment のポッドが VerticalPodAutoscaler に属していることもわかります。なぜなら、ポッドが指しているターゲットが 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 を再起動することもできます。

リソース リクエストを自動的に更新する

この演習では、ポッドを 2 つ持つ Deployment を作成します。各ポッドは、CPU リクエストが 100 milliCPU、メモリ リクエストが 50 MiB のコンテナを 1 つずつ持ちます。次に、CPU リクエストとメモリ リクエストを自動的に調整する VerticalPodAutoscaler を作成します。

Deployment のマニフェストは次のとおりです。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-auto-deployment
spec:
  replicas: 2
  template:
    metadata:
      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-deployment.yaml という名前のファイルにコピーして Deployment を作成します。

kubectl create -f my-deployment.yaml

次のようにして、実行中のポッドのリストを表示します。

kubectl get pods

出力に、my-deployment 内のポッドの名前が表示されます。

NAME                            READY     STATUS             RESTARTS   AGE
my-deployment-cbcdd49fb-d6bf9   1/1       Running            0          8s
my-deployment-cbcdd49fb-th288   1/1       Running            0          8s

後で使用できるように、ポッド名をメモします。

Deployment の CPU リクエストとメモリ リクエストは非常に小さいため、リソースの増加は Deployment にメリットをもたらす可能性があります。

VerticalPodAutoscaler のマニフェストは次のとおりです。

apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa
spec:
  targetRef:
    apiVersion: "extensions/v1beta1"
    kind:       Deployment
    name:       my-deployment
  updatePolicy:
    updateMode: "Auto"

このマニフェストの targetRef フィールドは、my-deployment という名前の Deployment によって制御されるすべてのポッドが、この VerticalPodAutoscaler に属することを示しています。

updateMode フィールドの値は Auto ですが、これは VerticalPodAutoscaler がポッドのライフサイクル期間中に CPU リクエストおよびメモリ リクエストを更新できるという意味です。つまり、VerticalPodAutoscaler はポッドを削除し、CPU リクエストとメモリ リクエストを調整して、新しいポッドを開始できるということです。

このマニフェストを my-vpa.yaml という名前のファイルにコピーし、次のようにして VerticalPodAutoscaler を作成します。

kubectl create -f my-vpa.yaml

数分待ってから、次のようにして実行中のポッドを再度表示します。

kubectl get pods

ポッド名が変更されていることを確認します。ポッド名がまだ変更されていない場合は、さらに少し待ってから、実行中のポッドを再度表示します。

次のようにして、実行中のポッドの詳細情報を取得します。

kubectl get pod [POD_NAME] --output yaml

ここで、[POD_NAME] はポッド名です。

出力から、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 推奨値に基づいて、ポッドを削除して新しいポッドに置き換えるかどうかを決定します。ポッドが下限より小さい、または上限より大きいリクエストを有する場合、VerticalPodAutoscaler はそのポッドを削除し、ターゲット推奨値を有するポッドに置き換えます。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント