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

このページでは、垂直 Pod 自動スケーリングを使用して Google Kubernetes Engine(GKE)クラスタ内のコンテナの CPU リクエストメモリ リクエストを分析して調整する方法について説明します。

コンテナ リソースは、Google Cloud コンソールまたは VerticalPodAutoscaler オブジェクトを使用して手動でスケーリングできます。また、垂直 Pod 自動スケーリングを使用して自動スケーリングを構成することもできます。

リソース リクエストのベスト プラクティスについて詳しくは、Kubernetes のベスト プラクティス: リソース リクエストと上限をご覧ください。

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

準備

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

  • Google Kubernetes Engine API が有効になっていることを確認します。
  • Google Kubernetes Engine API の有効化
  • Google Cloud CLI がインストールされていることを確認します。
  • 次のいずれかの方法で、プロジェクトにデフォルトの Google Cloud CLI 設定をセットアップします。
    • プロジェクトのデフォルトの設定全般を確認する場合は、gcloud init を使用します。
    • gcloud config を使用して、プロジェクト ID、ゾーン、リージョンを個別に設定します。

    gcloud init

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

      gcloud init

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

      gcloud init --console-only
    2. Google Cloud アカウントを使用できるように、gcloud CLI の承認手順を行います。
    3. 新しい構成を作成するか、既存の構成を選択します。
    4. Google Cloud プロジェクトを選択します。
    5. デフォルトの Compute Engine ゾーンを選択します。
    6. デフォルトの Compute Engine リージョンを選択します。

    gcloud config

    1. デフォルトのプロジェクト ID を設定します。
      gcloud config set project PROJECT_ID
    2. デフォルトの Compute Engine リージョン(例: us-central1)を設定します。
      gcloud config set compute/region COMPUTE_REGION
    3. デフォルトの Compute Engine ゾーン(例: us-central1-c)を設定します。
      gcloud config set compute/zone COMPUTE_ZONE
    4. gcloud を最新バージョンに更新します。
      gcloud components update

    デフォルトの場所を設定することで、gcloud CLI のエラー(One of [--zone, --region] must be supplied: Please specify location など)を防止できます。

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

垂直 Pod オートスケーラーはコンテナを自動的に分析し、推奨されるリソース リクエストを提供します。これらのリソース リクエストは、Cloud Console、Cloud Monitoring、Google Cloud CLI を使用して表示できます。

Console

Cloud コンソールで推奨されるリソース リクエストを表示するには、少なくとも 24 時間以上前のワークロードをデプロイする必要があります。

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

    [ワークロード] に移動

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

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

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

Cloud Monitoring

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

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

    Metrics Explorer に移動

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

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

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

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

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

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

gcloud CLI

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

  1. クラスタの垂直 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 が記述されています。[updateMode -Off垂直 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 または Cloud コンソールを使用して手動で設定できます。

Console

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

    [ワークロード] に移動

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

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

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

  5. [Save Changes] をクリックします。

  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
    

    このマニフェストには、Pod を 2 つ持つ Deployment が記述されています。各 Pod は、CPU リクエストが 25 milliCPU、メモリ リクエストが 256 MiB のコンテナを 1 つずつ持ちます。

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

    kubectl apply -f my-adjusted-deployment.yaml
    

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

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

    [ワークロード] に移動

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

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

  4. [同等の YAML を取得] をクリックします。

  5. リソース リクエストを適用するコンテナを選択します。

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

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

    kubectl create -f resource-adjusted.yaml
    

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

垂直 Pod 自動スケーリングは、updateMode"Auto" の場合に VerticalPodAutoscaler オブジェクトを使用して、Pod のリソース リクエストを自動的に設定します。

  1. クラスタの垂直 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: 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"]
    

    このマニフェストには、Pod を 2 つ持つ Deployment が記述されています。各 Pod は、CPU リクエストが 100 milliCPU、メモリ リクエストが 50 MiB のコンテナを 1 つずつ持ちます。

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

    kubectl create -f my-auto-deployment.yaml
    
  4. 次のようにして、実行中のポッドのリストを表示します。

    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 であることは、垂直 Pod オートスケーラー コントローラが Pod を削除し、CPU リクエストとメモリ リクエストを調整して、新しい Pod を起動できることを表します。

    updateMode: "Initial" を使用して、Pod の作成時にのみリソース リクエストを割り当てるように垂直 Pod 自動スケーリングを構成することもできます。

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

    kubectl create -f my-vpa.yaml
    
  7. 数分待ってから、次のようにして実行中のポッドを再度表示します。

    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 を再度表示します。

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

    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 に引き上げたことを示しています。

  9. 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 のメモリをリクエストするよう指定します。

    垂直 Pod オートスケーラーは、lowerBound 属性と upperBound 属性に基づいて、Pod を削除して新しい Pod に置き換えるかどうかを決定します。Pod が下限より小さい、または上限より大きいリクエストを有する場合、垂直 Pod オートスケーラーはその Pod を削除し、ターゲット属性を有する Pod に置き換えます。

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

この演習では、特定のコンテナが無効にされた VerticalPodAutoscaler オブジェクトを作成します。次に、1 つの Pod と 2 つのコンテナを持つ Deployment を作成します。Pod の作成時に、垂直 Pod オートスケーラーは 1 つのコンテナに対してのみ推奨値を作成して適用し、無効になっているコンテナは無視します。

  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. しばらくして、垂直 Pod オートスケーラーを表示します。

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

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

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

    1 つのコンテナにのみ推奨値があります。my-opt-sidecar に対する推奨値はありません。

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

クリーンアップ

このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. クラスタで垂直 Pod 自動スケーリングを無効にします。

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

    CLUSTER_NAME はクラスタの名前で置き換えます。

  2. 必要に応じて、クラスタを削除できます。

次のステップ