このページでは、カスタム コンピューティング クラスを使用して、ワークロードの特定のニーズに基づいて Google Kubernetes Engine(GKE)クラスタのコンピューティング インフラストラクチャと自動スケーリングの動作を制御する方法について説明します。ここでは、カスタム コンピューティング クラスのコンセプトに精通していることを前提としています。詳細については、カスタム コンピューティング クラスについてをご覧ください。
このページは、ノードの自動スケーリング プロファイルを宣言的に定義するプラットフォーム管理者と、特定のコンピューティング クラスでワークロードを実行するクラスタ オペレーターを対象としています。
カスタム コンピューティング クラスについて
カスタム コンピューティング クラスは、ワークロードを実行するノードをプロビジョニングするときに GKE が従う優先度を定義できる Kubernetes のカスタム リソースです。カスタム コンピューティング クラスを使用すると、次のことができます。
- ノードのプロビジョニング時に GKE が適用する優先順位を設定する。各ノードには、Compute Engine マシンシリーズや最小リソース容量などの特定のパラメータが設定されます。
- 未使用のノードを削除し、既存のコンピューティング容量でワークロードを効率的に統合するための自動スケーリングのしきい値とパラメータを定義する。
- ワークロードのパフォーマンスを最適化するために、優先度の低いノード構成を優先度の高いノード構成に自動的に置き換えるように GKE に指示する。
これらの構成オプションと、それらの関係、また GKE Autopilot モードや GKE Standard モードとどのように連携するかについては、カスタム コンピューティング クラスについてをご覧ください。
料金
ComputeClass
カスタム リソースは、GKE で追加料金なしで提供されます。次の料金に関する考慮事項が適用されます。
GKE Autopilot モード: ノードベースの課金モードで課金されます。詳細については、Autopilot モードの料金をご覧ください。
GKE Standard モード: Standard モードの料金をご覧ください。
始める前に
始める前に、次の作業が完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
- バージョン 1.30.3-gke.1451000 以降を実行している既存の GKE クラスタがあることを確認します。詳細については、Autopilot クラスタを作成するをご覧ください。
- Standard モードのクラスタを使用している場合は、自動スケーリングが有効になっているノードプールが少なくとも 1 つあるか、クラスタでノードの自動プロビジョニングが使用されていることを確認します。
コンピューティング クラスのシナリオ例
このページでは、カスタム コンピューティング クラスを定義するシナリオの例を示します。実際には、特定のワークロードと組織の要件を考慮し、それらの要件を満たすコンピューティング クラスを定義する必要があります。コンピューティング クラスのオプションの詳細と特別な考慮事項については、カスタム コンピューティング クラスについてをご覧ください。
例として、次のシナリオについて考えてみます。
- ワークロードの実行コストを最適化することを目標としている
- ワークロードがフォールト トレラントで、正常なシャットダウンやランタイムの延長が不要である
- ワークロードを最適に実行するには、少なくとも 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 のスケジュールが想定どおりになるように手動での構成が必要になる場合があります。手動構成は、ノードプールが自動的にプロビジョニングされるかどうかによって異なります。
- ノードの自動プロビジョニングによって管理されるノードプール: 手動構成は必要ありません。ノードの自動プロビジョニングでは、コンピューティング クラスの構成手順が自動的に実行されます。詳細については、ノードの自動プロビジョニングとコンピューティング クラスをご覧ください。
- 手動で作成したノードプール: 手動での構成が必要です。手動で作成したノードプールにノードラベルとノード 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: false activeMigration: optimizeRulePriority: true
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
: 既存のクラスタの名前。
オンデマンド 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 のデフォルトとしてコンピューティング クラスを設定する手順は次のとおりです。
Namespace を作成します。
kubectl create namespace cost-optimized-ns
コンピューティング クラスで Namespace にラベルを付けます。
kubectl label namespaces cost-optimized-ns \ cloud.google.com/default-compute-class=cost-optimized
ワークロードでコンピューティング クラスをリクエストする
ワークロードでコンピューティング クラスをリクエストするには、マニフェストにそのコンピューティング クラスのノードセレクタを追加します。
次のマニフェストを
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"
ワークロードをデプロイします。
kubectl apply -f cc-workload.yaml
このワークロードをデプロイすると、GKE は、リクエストされたコンピューティング クラスのノード taint に対応する toleration を Pod に自動的に追加します。この toleration により、コンピューティング クラスをリクエストする Pod のみがコンピューティング クラスノードで実行されます。