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


このページでは、垂直 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 を実行して最新のバージョンを取得する。

リソース リクエストを分析する

VerticalPodAutoscaler は、コンテナを自動的に分析し、推奨されるリソース リクエストを提供します。これらのリソース リクエストは、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 コンソールまたは kubectl を使用して手動で設定できます。コンテナのリソース リクエスト数と上限を設定する際のベスト プラクティスは次のとおりです。

  • メモリ: リクエストと上限に対して同じ量のメモリを設定します。
  • CPU: リクエストで、独自の SLO に従って、正しい動作を保証するために必要な最小 CPU を指定します。無制限の CPU 上限を設定します。

コンソール

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

    [ワークロード] に移動

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

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

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

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

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

kubectl

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.14
            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 つのコンテナのみです。

リソース リクエストまたは上限のないワークロードを特定する

GKE では、ノードのリソースが不足した場合の Pod の突然の終了を回避し、費用の割り当ての精度を高めるために、すべてのワークロードにリソース リクエストと上限を設定することをベスト プラクティスとして推奨しています。そのため、リソース リクエストと上限が構成されていないワークロードを特定することをおすすめします。BestEffort Pod または Burstable メモリを持つ Pod を定義すると、ノードでメモリ不足が発生したときに信頼性の問題が発生する可能性があります。コンテナのリソース リクエスト数と上限を設定する際のベスト プラクティスは次のとおりです。

  • メモリ: リクエストと上限に対して同じ量のメモリを設定します。
  • CPU: リクエストで、独自の SLO に従って、正しい動作を保証するために必要な最小 CPU を指定します。無制限の CPU 上限を設定します。

GKE は、リソース リクエストと上限なしで実行されているワークロードの分析情報と推奨事項を生成します。

次の表に、GKE が検出するリソース構成シナリオと、各シナリオの条件を示します。

分析情報のサブタイプ 設定が見つからないシナリオ 詳細
REQUEST_OR_LIMIT_NOT_SET メモリ リクエストと上限が構成されていません。(MEMORY_REQUEST_AND_LIMIT_NOT_SET コンテナでメモリのリクエストと上限が設定されずに Pod が実行されています。GKE はメモリ使用量をスロットリングできないため、ノードでメモリ不足が発生すると、このような Pod を突然終了する可能性があります。これにより、信頼性の問題が発生する可能性があります。
REQUEST_OR_LIMIT_NOT_SET メモリ上限が構成されていません。(MEMORY_LIMIT_NOT_SET コンテナでメモリの上限が設定されずに Pod が実行されています。GKE はメモリ使用量をスロットリングできません。ノードでメモリ不足が発生し、Pod のメモリ使用量がリクエストを超えると、Pod が突然終了して、信頼性の問題が発生する可能性があります。リクエストと上限に対して同じ量のメモリを設定して、Pod がリクエストされた量よりも多くのメモリを使用しないようにする必要があります。
REQUEST_OR_LIMIT_NOT_SET CPU のリクエストと上限が構成されていません。(CPU_REQUEST_AND_LIMIT_NOT_SET コンテナで CPU のリクエストと上限が設定されずに Pod が実行されているため、ノードのリソースが枯渇する可能性が高くなります。このため、ノードの CPU 使用率がその上限に近づくと Pod がスロットリングされやすくなり、パフォーマンスの問題が発生するおそれがあります。

これらの分析情報の詳細については、分析情報と推奨事項を表示する手順沿って操作してください。

リソース リクエストと上限を手動で確認する

推奨に従って構成を更新できるように、特定のワークロードでリソース リクエストと上限が不足しているか、指定する必要があるかを手動で確認することをおすすめします。

指定したワークロードのリソース リクエストと上限の構成を確認または更新するには、次の操作を行います。

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

    [ワークロード] に移動

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

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

    1. [リソース リクエストと上限の調整] セクションには、各コンテナの現在の CPU リクエストとメモリ リクエストが表示されます。

次のステップ