カスタム コンピューティング クラスを使用して、自動スケーリングされたノードの属性を制御する


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

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

カスタム コンピューティング クラスについて

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

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

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

料金

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

始める前に

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

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

コンピューティング クラスのシナリオ例

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

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

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

これらのシナリオに基づいて、次のようなコンピューティング クラスを作成するとします。

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

Autopilot モードでコンピューティング クラスを構成する

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

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

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

Standard モードでコンピューティング クラスを構成する

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

手動で作成したノードプールでコンピューティング クラスを使用する

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

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

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

    gcloud container node-pools create cost-optimized-pool \
        --location=LOCATION \
        --cluster=CLUSTER_NAME \
        --machine-type=n2-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 を使用して新しい自動スケーリング ノードプールを作成し、コンピューティング クラスに関連付けます。

    gcloud container node-pools create on-demand-pool \
        --location=LOCATION \
        --cluster=CLUSTER_NAME \
        --machine-type=n2-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"
    

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

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

自動プロビジョニングされたノードプールでコンピューティング クラスを使用する

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

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

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

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

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

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

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

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

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

クラスタにコンピューティング クラスをデプロイする

コンピューティング クラスを定義したら、クラスタにデプロイします。

kubectl apply -f compute-class.yaml

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

Namespace のデフォルトのコンピューティング クラスを設定する

Namespace にデフォルトのコンピューティング クラスを設定したとき、GKE はそのコンピューティング クラスを使用して、Namespace にデプロイする Pod のノードを作成します。Pod が別のコンピューティング クラスを明示的にリクエストすると、Pod レベルのリクエストが Namespace のデフォルトをオーバーライドします。

特定の Namespace のデフォルトとしてコンピューティング クラスを設定する手順は次のとおりです。

  1. Namespace を作成します。

    kubectl create namespace cost-optimized-ns
    
  2. コンピューティング クラスで Namespace にラベルを付けます。

    kubectl label namespaces cost-optimized-ns \
        cloud.google.com/default-compute-class=cost-optimized
    

ワークロードでコンピューティング クラスをリクエストする

ワークロードでコンピューティング クラスをリクエストするには、マニフェストにそのコンピューティング クラスのノードセレクタを追加します。

  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 は、リクエストされたコンピューティング クラスのノード taint に対応する toleration を Pod に自動的に追加します。この toleration により、コンピューティング クラスをリクエストする Pod のみがコンピューティング クラスノードで実行されます。

次のステップ