コンテナ リソースのリクエストと上限のスケール

このページでは、垂直 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 で作成されたアプリなど)、推奨値がないか、適切ではない場合があります。

  1. Google Cloud コンソールの [ワークロード] ページに移動します。

    [ワークロード] に移動

  2. ワークロード リストで、スケールするワークロードの名前をクリックします。

  3. [アクション] > [スケール] > [リソース リクエストを編集] をクリックします。

    [リソース使用率データの分析] セクションには、[リソース リクエストと上限の調整] セクションで推奨リソース リクエストを作成するために垂直 Pod オートスケーラー コントローラが分析したリソース使用量履歴データが表示されます。

Cloud Monitoring

Cloud Monitoring で推奨されるリソース リクエストを表示するには、既存のワークロードをデプロイしておく必要があります。

  1. Google Cloud コンソールの [Metrics Explorer] ページに移動します。

    [Metrics Explorer] に移動

  2. [構成] をクリックします。

  3. [指標を選択] メニューを開きます。

  4. [リソース] メニューで [Kubernetes スケール] を選択します。

  5. [指標カテゴリ] メニューで、[オートスケーラー] を選択します。

  6. [指標] メニューで、[推奨されるレプリカあたりのリクエスト バイト数] と [推奨されるレプリカあたりのリクエストコア数] を選択します。

  7. [適用] をクリックします。

gcloud CLI

推奨されるリソース リクエストを表示するには、VerticalPodAutoscaler オブジェクトと Deployment を作成する必要があります。

  1. Standard クラスタの場合は、クラスタに対して垂直 Pod 自動スケーリングを有効にします。Autopilot クラスタの場合、垂直 Pod 自動スケーリングがデフォルトで有効になっています。

    gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
    

    CLUSTER_NAME は、使用するクラスタの名前に置き換えます。

  2. 次のマニフェストを 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-deploymentcontainers.name 値は、Deployment 内のすべての Pod が VerticalPodAutoscaler に属していることを指定します。

  3. マニフェストをクラスタに適用します。

    kubectl create -f my-rec-deployment.yaml
    
  4. 次のマニフェストを 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 が記述されています。OffupdateMode 値は、Pod が作成されると、垂直 Pod オートスケーラー コントローラがコンテナの CPU とメモリのニーズを分析し、推奨値をリソースの status フィールドに記録することを表します。垂直 Pod 自動スケーリング コントローラは、コンテナを実行するためのリソース リクエストを自動的に更新しません。

  5. マニフェストをクラスタに適用します。

    kubectl create -f my-rec-vpa.yaml
    
  6. しばらくしてから、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 コンソールを使用して手動で設定できます。

コンソール

  1. Google Cloud コンソールの [ワークロード] ページに移動します。

    [ワークロード] に移動

  2. ワークロード リストで、スケールするワークロードの名前をクリックします。

  3. [アクション] > [スケール] > [リソース リクエストを編集] をクリックします。

    1. [リソース リクエストと上限の調整] セクションには、各コンテナの現在の CPU リクエストとメモリ リクエスト、および推奨される CPU リクエストとメモリ リクエストが表示されます。
  4. 各コンテナに対して推奨されるリクエストを表示するには、[最新の提案を適用] をクリックします。

  5. [変更を保存] をクリックします。

  6. [確認] をクリックします。

gcloud

Pod のリソース リクエストを設定するには、Deployment マニフェストで requests.cpu と memory.cpu の値を設定します。この例では、リソース リクエストを分析する で作成した Deployment を手動で変更することをおすすめします。

  1. 次のマニフェストの例を 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 つずつ持ちます。

  2. マニフェストをクラスタに適用します。

    kubectl apply -f my-adjusted-deployment.yaml
    

次の手順で、変更を手動で適用することもできます。

  1. Google Cloud コンソールの [ワークロード] ページに移動します。

    [ワークロード] に移動

  2. ワークロード リストで、スケールするワークロードの名前をクリックします。

  3. [アクション] > [スケール] > [リソース リクエストを編集] をクリックします。

  4. コンテナ リクエストを構成します。

  5. [Get Equivalent YAML] をクリックします。

  6. [ワークロードをダウンロード ] をクリックするか、マニフェストをコピーして resource-adjusted.yaml という名前のファイルに貼り付けます。

  7. マニフェストをクラスタに適用します。

    kubectl create -f resource-adjusted.yaml
    

Pod のリソース リクエストを自動的に設定する

垂直 Pod 自動スケーリングは、updateModeAuto の場合に VerticalPodAutoscaler オブジェクトを使用して、Pod でリソース リクエストを自動的に設定します。VerticalPodAutoscaler は、gcloud CLI または Google Cloud コンソールを使用して構成できます。

コンソール

リソース リクエストを自動的に設定するには、垂直 Pod 自動スケーリング機能が有効になっているクラスタが必要です。Autopilot クラスタでは、垂直 Pod 自動スケーリング機能がデフォルトで有効になっています。

垂直 Pod 自動スケーリングを有効にする

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. [自動化] セクションで、[垂直 Pod 自動スケーリング] オプションの [編集] をクリックします。

  4. [垂直 Pod 自動スケーリングを有効にする] チェックボックスをオンにします。

  5. [変更を保存] をクリックします。

垂直 Pod 自動スケーリングを構成する

  1. Google Cloud コンソールの [ワークロード] ページに移動します。

    [ワークロード] に移動

  2. ワークロード リストで、垂直 Pod 自動スケーリングを構成する Deployment の名前をクリックします。

  3. [操作] > [自動スケーリング] > [垂直 Pod 自動スケーリング] の順にクリックします。

  4. 自動スケーリング モードを選択します。

    • [自動] モード: 垂直 Pod 自動スケーリングは、Pod のライフサイクル期間中に CPU リクエストとメモリ リクエストを更新します。
    • [初期] モード: 垂直 Pod 自動スケーリングは、Pod の作成時にのみリソース リクエストを割り当て、後で変更することはありません。
  5. (省略可)コンテナ ポリシーを設定します。このオプションを使用すると、推奨値が指定したリソース リクエストの量を上回ることも、下回ることもなくなります。

    1. [ポリシーを追加] をクリックします。
    2. [Edit container mode] で [自動] を選択します。
    3. [制御対象リソース] で、コンテナを自動スケーリングするリソースを選択します。
    4. [ルールを追加] をクリックして、コンテナのリソース リクエストの最小範囲または最大範囲を設定します。
      • 許容最小メモリ: コンテナに常に必要な最小メモリ量(MiB 単位)。
      • 許容最小 CPU: コンテナに常に必要な最小 CPU 数(mCPU 単位)。
      • 許容最大メモリ: コンテナが常に保持する必要がある最大メモリ量(MiB 単位)。
      • 許容最大 CPU: コンテナで常に使用する最大 CPU 数(mCPU 単位)。
  6. [完了] をクリックします。

  7. [保存] をクリックします。

gcloud

リソース リクエストを自動的に設定するには、垂直 Pod 自動スケーリング機能が有効になっているクラスタを使用する必要があります。Autopilot クラスタではこの機能がデフォルトで有効になっています。

  1. Standard クラスタの場合は、クラスタで垂直 Pod 自動スケーリングを有効にします。

    gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
    

    CLUSTER_NAME は、使用するクラスタの名前に置き換えます。

  2. 次のマニフェストを 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 つずつ持ちます。

  3. マニフェストをクラスタに適用します。

    kubectl create -f my-auto-deployment.yaml
    
  4. 次のようにして、実行中の 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
    
  5. 次のマニフェストを 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 自動スケーリングを構成することもできます。

  6. マニフェストをクラスタに適用します。

    kubectl create -f my-vpa.yaml
    
  7. 数分待ってから、次のようにして実行中の 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 の詳細を表示するには、次のようにします。

  1. 次のようにして、実行中の 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 であることを示しています。

  2. 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 のメモリをリクエストするよう指定します。
    • lowerBoundupperBound: 垂直 Pod 自動スケーリングはこれらのプロパティを使用して、Pod を削除して新しい Pod に置き換えるかどうかを決定します。Pod が下限より小さい、または上限より大きいリクエストを有する場合、VerticalPodAutoscaler はその Pod を削除し、ターゲット属性を有する Pod に置き換えます。

特定のコンテナを無効にする

垂直 Pod 自動スケーリングから特定のコンテナをオプトアウトするには、gcloud CLI または Google Cloud コンソールを使用します。

コンソール

垂直 Pod 自動スケーリングから特定のコンテナをオプトアウトするには、垂直 Pod 自動スケーリング機能が有効になっているクラスタが必要です。Autopilot クラスタでは、垂直 Pod 自動スケーリング機能がデフォルトで有効になっています。

垂直 Pod 自動スケーリングを有効にする

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. [自動化] セクションで、[垂直 Pod 自動スケーリング] オプションの [編集] をクリックします。

  4. [垂直 Pod 自動スケーリングを有効にする] チェックボックスをオンにします。

  5. [変更を保存] をクリックします。

垂直 Pod 自動スケーリングを構成する

  1. Google Cloud コンソールの [ワークロード] ページに移動します。

    [ワークロード] に移動

  2. ワークロード リストで、垂直 Pod 自動スケーリングを構成する Deployment の名前をクリックします。

  3. [操作] > [自動スケーリング] > [垂直 Pod 自動スケーリング] の順にクリックします。

  4. 自動スケーリング モードを選択します。

    • [自動] モード: 垂直 Pod 自動スケーリングは、Pod のライフサイクル期間中に CPU リクエストとメモリ リクエストを更新します。
    • [初期] モード: 垂直 Pod 自動スケーリングは、Pod の作成時にのみリソース リクエストを割り当て、後で変更することはありません。
  5. [ポリシーを追加] をクリックします。

  6. オプトアウトするコンテナを選択します。

  7. [Edit container mode] で [オフ] を選択します。

  8. [完了] をクリックします。

  9. [保存] をクリックします。

gcloud

垂直 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 の推奨値をオフにします。

  2. マニフェストをクラスタに適用します。

    kubectl apply -f my-opt-vpa.yaml
    
  3. 次のマニフェストを 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"]
    
  4. マニフェストをクラスタに適用します。

    kubectl apply -f my-opt-deployment.yaml
    
  5. しばらくして、VerticalPodAutoscaler を表示します。

    kubectl get vpa my-opt-vpa --output yaml
    

    出力に、CPU リクエストとメモリ リクエストの推奨値が表示されます。

    ...
      recommendation:
        containerRecommendations:
        - containerName: my-opt-container
    ...
    

    この出力では、1 つのコンテナの推奨値のみが示されています。my-opt-sidecar に対する推奨値はありません。

    垂直 Pod オートスケーラーによって、無効にされたコンテナのリソースが更新されることはありません。数分待つと Pod が再作成されますが、リソース リクエストが更新されるのは 1 つのコンテナのみです。

次のステップ