カスタム ComputeClass を使用して、自動スケーリングされたノードの属性を制御する

このページでは、カスタム ComputeClass を使用して、ワークロードの特定のニーズに基づいて Google Kubernetes Engine(GKE)クラスタのコンピューティング インフラストラクチャと自動スケーリングの動作を制御する方法について説明します。ここでは、カスタム ComputeClass のコンセプトに精通していることを前提としています。詳細については、カスタム ComputeClass についてをご覧ください。

このページは、ノードの自動スケーリング プロファイルを宣言的に定義するプラットフォーム管理者と、特定の ComputeClass でワークロードを実行するクラスタ オペレーターを対象としています。

カスタム ComputeClass について

カスタム ComputeClass は、ワークロードを実行するノードをプロビジョニングするときに GKE が従う優先度を定義できる Kubernetes のカスタム リソースです。カスタム ComputeClass を使用すると、次のことができます。

  • ノードのプロビジョニング時に GKE が適用する優先順位を設定する。各ノードには、Compute Engine マシンシリーズや最小リソース容量などの特定のパラメータが設定されます。
  • 未使用のノードを削除し、既存のコンピューティング容量でワークロードを効率的に統合するための自動スケーリングのしきい値とパラメータを定義する。
  • ワークロードのパフォーマンスを最適化するために、優先度の低いノード構成を優先度の高いノード構成に自動的に置き換えるように GKE に指示する。

これらの構成オプションと、それらの関係、また GKE Autopilot モードや GKE Standard モードとどのように連携するかについては、カスタム ComputeClass についてをご覧ください。

料金

ComputeClass カスタム リソースは、GKE で追加料金なしで提供されます。次の料金に関する考慮事項が適用されます。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

ComputeClass のシナリオ例

このページでは、カスタム ComputeClass を定義するシナリオの例を示します。実際には、特定のワークロードと組織の要件を考慮し、それらの要件を満たす ComputeClass を定義する必要があります。ComputeClass のオプションの詳細と特別な考慮事項については、カスタム ComputeClass についてをご覧ください。

例として、次のシナリオについて考えてみます。

  • ワークロードの実行コストを最適化することを目標としている
  • ワークロードがフォールト トレラントで、正常なシャットダウンやランタイムの延長が不要である
  • ワークロードを最適に実行するには、少なくとも 64 個の vCPU が必要
  • N4 Compute Engine マシンシリーズに限定されている

これらのシナリオに基づいて、次のような ComputeClass を作成するとします。

  • 64 個以上の vCPU を持つ N4 Spot ノードを優先的に割り当てる
  • コンピューティング容量に関係なく、GKE が任意の N4 Spot ノードにフォールバックできるようにする。
  • N4 Spot ノードが使用できない場合は、GKE がオンデマンド N4 ノードを使用できるようにする。
  • ワークロードが再び使用可能になったら、Spot ノードに移動するように GKE に指示する。

Autopilot モードで ComputeClass を構成する

GKE Autopilot では、ComputeClass を定義し、クラスタにデプロイして、ワークロードでその ComputeClass をリクエストします。GKE は、ラベルや taint の適用など、ノード構成のステップを自動的に実行します。

次のマニフェストを compute-class.yaml として保存します。

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: cost-optimized
spec:
  priorities:
  - machineFamily: n4
    spot: true
    minCores: 64
  - machineFamily: n4
    spot: true
  - machineFamily: n4
    spot: false
  activeMigration:
    optimizeRulePriority: true
  nodePoolAutoCreation:
    enabled: true

Standard モードで ComputeClass を構成する

GKE Standard モードのクラスタで ComputeClass を定義した後、ComputeClass の Pod のスケジュールが想定どおりになるように手動での構成が必要になる場合があります。手動構成は、ノードプールが自動的にプロビジョニングされるかどうかによって異なります。

  • ノード自動プロビジョニングによって管理されるノードプール: 手動構成は必要ありません。ノード自動プロビジョニングでは、ComputeClass の構成手順が自動的に実行されます。詳細については、ノード自動プロビジョニングと ComputeClass をご覧ください。
  • 手動で作成したノードプール: 手動での構成が必要です。手動で作成したノードプールにノードラベルとノード taint を追加し、ノードを特定の ComputeClass に関連付ける必要があります。詳細については、ComputeClass で使用するために手動で作成したノードプールを構成するをご覧ください。

手動で作成したノードプールで ComputeClass を使用する

このセクションでは、手動で作成したノードプールのみを使用するクラスタで ComputeClass を定義する方法について説明します。

  1. 次のマニフェストを compute-class.yaml として保存します。

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: cost-optimized
    spec:
      priorities:
      - machineFamily: n4
        spot: true
        minCores: 64
      - machineFamily: n4
        spot: true
      - machineFamily: n4
        spot: false
      activeMigration:
        optimizeRulePriority: true
    
  2. Spot VM を使用する新しい自動スケーリング ノードプールを作成し、ComputeClass に関連付けます。

    gcloud container node-pools create cost-optimized-pool \
        --location=LOCATION \
        --cluster=CLUSTER_NAME \
        --machine-type=n4-standard-64 \
        --spot \
        --enable-autoscaling \
        --max-nodes=9 \
        --node-labels="cloud.google.com/compute-class=cost-optimized" \
        --node-taints="cloud.google.com/compute-class=cost-optimized:NoSchedule"
    

    次のように置き換えます。

    • LOCATION: クラスタのロケーション。
    • CLUSTER_NAME: 既存のクラスタの名前。
  3. オンデマンド VM を使用して新しい自動スケーリング ノードプールを作成し、ComputeClass に関連付けます。

    gcloud container node-pools create on-demand-pool \
        --location=LOCATION \
        --cluster=CLUSTER_NAME \
        --machine-type=n4-standard-64 \
        --enable-autoscaling \
        --max-nodes=9 \
        --num-nodes=0 \
        --node-labels="cloud.google.com/compute-class=cost-optimized" \
        --node-taints="cloud.google.com/compute-class=cost-optimized:NoSchedule"
    

この ComputeClass をリクエストする Pod をデプロイし、新しいノードを作成する必要がある場合、GKE は cost-optimized-pool ノードプールでのノードの作成を優先します。新しいノードを作成できない場合、GKE は on-demand-pool ノードプールにノードを作成します。

手動で作成したノードプールがカスタム ComputeClass とどのように連携するかについて詳しくは、ComputeClass の使用のために手動で作成したノードプールを構成するをご覧ください。

自動プロビジョニングされたノードプールで ComputeClass を使用する

このセクションでは、ノード自動プロビジョニングを使用するクラスタで ComputeClass を定義する方法について説明します。

次のマニフェストを compute-class.yaml として保存します。

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: cost-optimized
spec:
  priorities:
  - machineFamily: n4
    spot: true
    minCores: 64
  - machineFamily: n4
    spot: true
  - machineFamily: n4
    spot: false
  activeMigration:
    optimizeRulePriority: true
  nodePoolAutoCreation:
    enabled: true

この ComputeClass をリクエストする Pod をデプロイし、新しいノードを作成する必要がある場合、GKE は priorities フィールドの順序項目にあるノードの作成を優先します。必要に応じて、GKE は ComputeClass のハードウェア要件を満たす新しいノードプールを作成します。

優先度で、正確なカスタム マシンタイプを指定することもできます。カスタム マシンタイプを使用するには、GKE バージョン 1.33.2-gke.1111000 以降が必要です。次の例では、n4-custom-8-20480 カスタム マシンタイプで Spot VM を優先し、Spot 容量が使用できない場合は同じタイプのオンデマンド VM にフォールバックする ComputeClass を構成します。

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: custom-machine-type
spec:
  priorities:
  - machineType: n4-custom-8-20480
    spot: true
  - machineType: n4-custom-8-20480
    spot: false
  nodePoolAutoCreation:
    enabled: true

カスタム ComputeClass でのノード自動プロビジョニングの仕組みについて詳しくは、ノード自動プロビジョニングと ComputeClass をご覧ください。

ノード統合の自動スケーリングのしきい値をカスタマイズする

デフォルトでは、GKE は使用率の低いノードを削除し、ワークロードを他の使用可能なノードに再スケジュールします。次の例に示すように、ComputeClass 定義の autoscalingPolicy フィールドを使用して、ノードが削除の候補になるしきい値とタイミングをカスタマイズできます。

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: cost-optimized
spec:
  priorities:
  - machineFamily: n4
    spot: true
    minCores: 64
  - machineFamily: n4
    spot: true
  - machineFamily: n4
    spot: false
  activeMigration:
    optimizeRulePriority: true
  autoscalingPolicy:
    consolidationDelayMinutes : 5
    consolidationThreshold    : 70

この例では、使用可能な CPU とメモリ容量の 70% 未満が 5 分以上使用されていないノードが削除の候補になります。使用可能なパラメータの一覧については、ノード統合の自動スケーリング パラメータを設定するをご覧ください。

クラスタに ComputeClass をデプロイする

ComputeClass を定義したら、クラスタにデプロイします。

kubectl apply -f compute-class.yaml

この ComputeClass は、クラスタで使用できる状態になりました。Pod 仕様で ComputeClass をリクエストできます。必要に応じて、特定の Namespace のデフォルトの ComputeClass として設定することもできます。

ワークロードで ComputeClass をリクエストする

ワークロードで ComputeClass をリクエストするには、マニフェストにその ComputeClass のノードセレクタを追加します。

  1. 次のマニフェストを cc-workload.yaml として保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: custom-workload
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: custom-workload
      template:
        metadata:
          labels:
            app: custom-workload
        spec:
          nodeSelector:
            cloud.google.com/compute-class: cost-optimized
          containers:
          - name: test
            image: gcr.io/google_containers/pause
            resources:
              requests:
                cpu: 1.5
                memory: "4Gi"
    
  2. ワークロードをデプロイします。

    kubectl apply -f cc-workload.yaml
    

このワークロードをデプロイすると、GKE は、リクエストされた ComputeClass のノード taint に対応する toleration を Pod に自動的に追加します。この toleration により、ComputeClass をリクエストする Pod のみが ComputeClass ノードで実行されます。

デプロイされた ComputeClass を更新する

デプロイされた ComputeClass を更新するには、ComputeClass の YAML マニフェストを変更します。次に、以下のコマンドを実行して変更したマニフェストをデプロイします。

kubectl apply -f PATH_TO_FILE

PATH_TO_FILE は、変更したマニフェストのパスに置き換えます。name フィールドの値が変更されていないことを確認します。

更新した ComputeClass をデプロイすると、GKE はその構成を使用して新しいノードを作成します。GKE により既存のノードが更新後の構成で変更されることはありません。

ComputeClass でアクティブな移行が使用されており、既存の Pod が移行の対象である場合、既存の Pod が GKE により更新後の構成を使用するノードに移動されることがあります。

次のステップ