コンパクト プレースメント ポリシーを使用して、Google Kubernetes Engine(GKE)ノードをゾーン内で相互に相対的に配置するかどうかを制御できます。
概要
GKE クラスタにノードプールとワークロードを作成するときには、コンパクト プレースメント ポリシーを定義できます。このポリシーでは、これらのノードまたはワークロードを互いにゾーン内の物理的に近い場所に配置するように指定できます。ノードを近づけることで、ノード間のネットワーク レイテンシが短縮されます。これは、密結合のバッチ ワークロードに特に役立ちます。
GKE Autopilot でコンパクト プレースメントを使用する
Autopilot クラスタでは、Pod 仕様にノードセレクタを追加することで、特定のワークロードのコンパクト プレースメントをリクエストできます。デフォルトの Autopilot コンパクト プレースメント ポリシーを使用することも、N2 マシンシリーズまたは N2D マシンシリーズの既存の Compute Engine コンパクト プレースメント ポリシーを使用することもできます。
制限事項
- GKE では、同じゾーンのコンパクト プレースメント内でワークロードがプロビジョニングされます。
Balanced
、Performance
、Accelerator
コンピューティング クラスで使用できます。- C2、C2D、C3、C3D、H3、N2、N2D のマシンタイプでのみ使用できます。
- A100、L4、H100 GPU でのみ使用できます。
- コンパクト プレースメントは、最大 1,500 個のノードでグループ化された Pod で使用できます。
コンパクト プレースメント ポリシーを有効にする
GKE Autopilot のコンパクト プレースメントを有効にするには、次のキーを使用して nodeSelector
を Pod 仕様に追加します。
cloud.google.com/gke-placement-group
: 同じコンパクト プレースメント グループ内で実行する必要のある Pod のグループに割り当てる識別子。各プレースメント グループのノード数は 1,500 に制限されています。プレースメント グループは、グループ化するとメリットが得られるワークロードのみに制限し、可能であれば、ワークロードを別々のプレースメント グループに分散することをおすすめします。リソースのタイプを定義する次のいずれかのキー。
cloud.google.com/compute-class: "Balanced"
cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
cloud.google.com/placement-policy-name
: (省略可)既存の Compute Engine コンパクト プレースメント ポリシーの名前。カスタム コンパクト プレースメント ポリシーは、GKE バージョン 1.31.1-gke.2010000 以降でのみ指定できます。手順については、このページのコンパクト プレースメント ポリシーを作成するをご覧ください。
次の Pod 仕様の例では、カスタム コンパクト プレースメント ポリシーを使用してコンパクト プレースメントを有効にしています。
apiVersion: v1
kind: Pod
metadata:
# lines omitted for clarity
spec:
nodeSelector:
cloud.google.com/gke-placement-group: "placement-group-1"
cloud.google.com/compute-class: "Balanced"
cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME
PLACEMENT_POLICY_NAME
は、既存の Compute Engine コンパクト プレースメント ポリシーの名前に置き換えます。Autopilot のデフォルトのコンパクト プレースメント ポリシーを使用する場合は、cloud.google.com/placement-policy-name
行を省略します。
プレースメント グループを使用せずにカスタム コンパクト プレースメント ポリシーを使用する
プレースメント グループのないカスタム コンパクト プレースメント ポリシーを使用するには、Pod 仕様に cloud.google.com/placement-policy-name
ノードセレクタを追加する必要があります。
この方法は、JobSet を使用して各ジョブを個別にスケジュールしながら、カスタム コンパクト プレースメント ポリシーを使用して、同じジョブを実行するノードを近くに配置したい場合に役立ちます。
JobSet ではジョブごとに異なるノードセレクタを指定できないため、このシナリオではプレースメント グループで JobSet を使用できません。ただし、排他的なトポロジに対する JobSet の組み込みサポートを使用しても同じ効果が得られます。
次の Pod 仕様の例では、JobSet ワークロードのカスタム コンパクト プレースメント ポリシーを使用してコンパクト プレースメントを有効にしています。
apiVersion: jobset.x-k8s.io/v1alpha2
kind: JobSet
metadata:
name: my-jobset
annotations:
alpha.jobset.sigs.k8s.io/exclusive-topology: cloud.google.com/gke-nodepool
spec:
replicatedJobs:
- name: my-job
template:
spec:
# lines omitted for clarity
template:
spec:
nodeSelector:
cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME
cloud.google.com/machine-family: "n2"
# lines omitted for clarity
PLACEMENT_POLICY_NAME
は、既存の Compute Engine コンパクト プレースメント ポリシーの名前に置き換えます。
GKE Standard でコンパクト プレースメントを使用する
制限事項
GKE Standard ノードプールのコンパクト プレースメントには、次の制限があります。
- 新しいノードプールでのみサポートされます。既存のノードプールでコンパクト プレースメントを有効または無効にすることはできません。
- 単一ゾーンで動作するノードプールでのみ使用できます。
- A2、A3、A4、C2、C2D、C3、C3D、C4、G2、H3、N2、N2D マシンタイプでのみ使用できます。ただし、A3 Ultra と A4 の場合は、コンパクト プレースメントではなく、ブロック ターゲット予約の使用をおすすめします。詳細については、容量を予約するをご覧ください。
- 各ポリシーで最大 1,500 個の Compute Engine VM インスタンスをサポートします。この上限を超えるノードプールは作成中に拒否されます。
- Blue / Green アップグレードでは、
placement-policy
フラグを使用してカスタム リソース ポリシーを指定することはサポートされていません。
コンパクト プレースメント ポリシーを作成する
Google Cloud CLI でコンパクト プレースメント ポリシーを作成するには、ノードプールまたはクラスタの作成時に placement-type=COMPACT
オプションを指定します。この設定により、GKE はノードプール内でノードを物理的に近い場所に配置しようとします。
クラスタで既存のリソース ポリシーを使用するには、ノードプールまたはクラスタの作成時に、placement-policy
フラグにカスタム ポリシーのロケーションを指定します。これにより、予約済みプレースメント、同じプレースメント ポリシーを持つ複数のノードプール、その他の高度なプレースメント オプションを柔軟に使用できます。ただし、--placement-type=COMPACT フラグを指定する場合よりも多くの手動操作が必要になります。たとえば、カスタム リソース ポリシーを作成、削除、維持する必要があります。リソース ポリシーを使用して、すべてのノードプールで VM インスタンスの最大数が遵守されるようにします。この上限に達し、一部のノードプールがその最大サイズに達していない場合、ノードの追加は失敗します。
placement-type
フラグと placement-policy
フラグを指定しない場合、デフォルトではノードのプレースメントに関する要件はありません。
新しいクラスタにコンパクト プレースメント ポリシーを作成する
新しいクラスタを作成するときに、デフォルトのノードプールに適用されるコンパクト プレースメント ポリシーを指定できます。クラスタに作成する後続のノードプールがある場合は、コンパクト プレースメントを適用するかどうかを指定する必要があります。
デフォルトのノードプールにコンパクト プレースメント ポリシーが適用された新しいクラスタを作成するには、次のコマンドを使用します。
gcloud container clusters create CLUSTER_NAME \
--machine-type MACHINE_TYPE \
--placement-type COMPACT \
--max-surge-upgrade 0 \
--max-unavailable-upgrade MAX_UNAVAILABLE
次のように置き換えます。
CLUSTER_NAME
: 新しいクラスタの名前。MACHINE_TYPE
: ノードに使用するマシンのタイプ。Standard クラスタの制限事項に記載されているサポート対象のマシンタイプである必要があります。--placement-type COMPACT
: デフォルトのノードプール内のノードにコンパクト プレースメントを適用します。MAX_UNAVAILABLE
: ノードプールのアップグレード中に同時に使用できないノードの最大数。コンパクト プレースメントには、アップグレード中に同じ場所に配置されたノードを検出する可能性を最適化するため、高速、サージ アップグレードなしをおすすめします。
既存のクラスタにコンパクト プレースメント ポリシーを作成する
既存のクラスタでは、コンパクト プレースメント ポリシーが適用されたノードプールを作成できます。
コンパクト プレースメント ポリシーが適用されたノードプールを作成するには、次のコマンドを使用します。
gcloud container node-pools create NODEPOOL_NAME \
--machine-type MACHINE_TYPE \
--cluster CLUSTER_NAME \
--placement-type COMPACT \
--max-surge-upgrade 0 \
--max-unavailable-upgrade MAX_UNAVAILABLE
次のように置き換えます。
NODEPOOL_NAME
: 新しいノードプールの名前。MACHINE_TYPE
: ノードに使用するマシンのタイプ。Standard クラスタの制限事項に記載されているサポート対象のマシンタイプである必要があります。CLUSTER_NAME
: 既存のクラスタの名前。--placement-type COMPACT
: 新しいノードプール内のノードにコンパクト プレースメントを適用することを示します。MAX_UNAVAILABLE
: ノードプールのアップグレード中に同時に使用できないノードの最大数。コンパクト プレースメントには、アップグレード中に同じ場所に配置されたノードを検出する可能性を最適化するため、高速、サージ アップグレードなしをおすすめします。
共有カスタム プレースメント ポリシーを使用してノードプールを作成する
リソース ポリシーを手動で作成して、複数のノードプールで使用できます。
クラスタの Google Cloud リージョンにリソース ポリシーを作成します。
gcloud compute resource-policies create group-placement POLICY_NAME \ --region REGION \ --collocation collocated
次のように置き換えます。
POLICY_NAME
: リソース ポリシーの名前。REGION
: クラスタのリージョン。
カスタム リソース ポリシーを使用してノードプールを作成します。
gcloud container node-pools create NODEPOOL_NAME \ --machine-type MACHINE_TYPE \ --cluster CLUSTER_NAME \ --placement-policy POLICY_NAME \ --max-surge-upgrade 0 \ --max-unavailable-upgrade MAX_UNAVAILABLE
次のように置き換えます。
NODEPOOL_NAME
: 新しいノードプールの名前。MACHINE_TYPE
: ノードに使用するマシンのタイプ。Standard クラスタの制限事項に記載されているサポート対象のマシンタイプである必要があります。CLUSTER_NAME
: 既存のクラスタの名前。MAX_UNAVAILABLE
: ノードプールのアップグレード中に同時に使用できないノードの最大数。コンパクト プレースメントには、アップグレード中に同じ場所に配置されたノードを検出する可能性を最適化するため、高速、サージ アップグレードなしをおすすめします。
コンパクト プレースメント ポリシーを使用する Compute Engine 予約を使用する
予約を使用すると、指定したゾーンでハードウェアが使用できることが保証され、ハードウェア不足が原因でノードプールの作成が失敗するリスクを軽減できます。
コンパクト プレースメント ポリシーを指定する予約を作成します。
gcloud compute reservations create RESERVATION_NAME \ --vm-count MACHINE_COUNT \ --machine-type MACHINE_TYPE \ --resource-policies policy=POLICY_NAME \ --zone ZONE \ --require-specific-reservation
次のように置き換えます。
RESERVATION_NAME
: 予約の名前。MACHINE_COUNT
: 予約済みノードの数。MACHINE_TYPE
: ノードに使用するマシンのタイプ。Standard クラスタの制限事項に記載されているサポート対象のマシンタイプである必要があります。POLICY_NAME
: リソース ポリシーの名前。ZONE
: 予約を作成するゾーン。
コンパクト プレースメント ポリシーと前の手順で作成した予約の両方を指定して、ノードプールを作成します。
gcloud container node-pools create NODEPOOL_NAME \ --machine-type MACHINE_TYPE \ --cluster CLUSTER_NAME \ --placement-policy POLICY_NAME \ --reservation-affinity specific \ --reservation RESERVATION_NAME \ --max-surge-upgrade 0 \ --max-unavailable-upgrade MAX_UNAVAILABLE
次のように置き換えます。
NODEPOOL_NAME
: 新しいノードプールの名前。MACHINE_TYPE
: ノードに使用するマシンのタイプ。Standard クラスタの制限事項に記載されているサポート対象のマシンタイプである必要があります。CLUSTER_NAME
: 既存のクラスタの名前。
コンパクト プレースメントを使用するノードにワークロードを作成する
コンパクト プレースメントを使用する専用ノードでワークロードを実行するには、次のようなノードへの Pod の割り当てや、ノードのグループに対する不要な Pod のスケジューリングの防止など、いくつかの Kubernetes メカニズムを使用します。
次の例では、専用ノードに taint を追加し、対応する容認とアフィニティを Pod に追加します。
コンパクト プレースメント ポリシーが設定されているノードプール内のノードに taint を追加します。
kubectl taint nodes -l cloud.google.com/gke-nodepool=NODEPOOL_NAME dedicated-pool=NODEPOOL_NAME:NoSchedule
ワークロード定義で、必要な許容範囲とノード アフィニティを指定します。次に、単一 Pod の例を示します。
apiVersion: v1 kind: Pod metadata: ... spec: ... tolerations: - key: dedicated-pool operator: "Equal" value: "NODEPOOL_NAME" effect: "NoSchedule" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: dedicated-pool operator: In values: - NODEPOOL_NAME
一部の場所では、コンパクト プレースメント ポリシーを使用して大規模なノードプールを作成できない場合があります。このようなノードプールのサイズを必要なサイズに制限するには、コンパクトな配置が必要なワークロードごとにノードプールを作成することをおすすめします。
ノードの自動プロビジョニングにコンパクト プレースメントを使用する
ノードの自動プロビジョニングにより、GKE はクラスタ リソースの需要に基づいてノードプールを自動的にプロビジョニングします。詳細については、ノードの自動プロビジョニングを使用するをご覧ください。
ノードの自動プロビジョニングのコンパクト プレースメントを有効にするには、次の例のように Pod 仕様に nodeSelector
を追加します。
apiVersion: v1
kind: Pod
metadata:
# lines omitted for clarity
spec:
nodeSelector:
cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
cloud.google.com/machine-family: MACHINE_FAMILY
cloud.google.com/placement-policy-name: PLACEMENT_POLICY_NAME
# lines omitted for clarity
次のように置き換えます。
PLACEMENT_GROUP_IDENTIFIER
: 同じコンパクト プレースメント グループ内で実行する必要のある Pod のグループに割り当てる識別子。MACHINE_FAMILY
: マシン ファミリーの名前。コンパクト プレースメントをサポートするマシン ファミリーのいずれかを使用します。コンピューティングとネットワークのパフォーマンス要件があるワークロードには、C2 または C2D マシン ファミリーを使用することをおすすめします。PLACEMENT_POLICY_NAME
: (省略可)既存の Compute Engine コンパクト プレースメント ポリシーの名前。ノード自動プロビジョニングによって新しいノードプールが作成され、Pod がグループ化されると、GKE は指定されたコンパクト プレースメント ポリシーを使用します。カスタム コンパクト プレースメント ポリシーは、GKE バージョン 1.31.1-gke.2010000 以降でのみ指定できます。手順については、このページのコンパクト プレースメント ポリシーを作成するをご覧ください。
Pod 構成で、コンパクト プレースメントでサポートされているマシンタイプがすでに定義されている場合は、cloud.google.com/machine-family
キーを省略できます。たとえば、Pod 仕様に nvidia.com/gpu
が含まれ、クラスタが A100 GPU を使用するように構成されている場合、cloud.google.com/machine-family
キーを含める必要はありません。
次の例は、nvidia.com/gpu
リクエストを定義する Pod 仕様で、クラスタが A100 GPU を使用するように構成されています。この Pod spec
には cloud.google.com/machine-family
キーが含まれていません。
apiVersion: v1
kind: Pod
metadata:
...
spec:
...
nodeSelector:
cloud.google.com/gke-placement-group: PLACEMENT_GROUP_IDENTIFIER
cloud.google.com/gke-accelerator: "nvidia-tesla-a100"
resources:
limits:
nvidia.com/gpu: 2
詳細については、GPU を使用するように Pod を構成するをご覧ください。
プレースメント グループのサイズを最適化する
GKE は小規模な Deployment に最適なプレースメントを見つけるため、同じプレースメント グループで異なるタイプの Pod を実行しないように GKE に指示することをおすすめします。cloud.google.com/gke-placement-group
キーと、定義したコンパクト プレースメント ID を指定して、toleration キーを追加します。
次の例は、コンパクト プレースメントを使用した Pod toleration を定義する Pod 仕様を示しています。
apiVersion: v1
kind: Pod
metadata:
...
spec:
...
tolerations:
- key: cloud.google.com/gke-placement-group
operator: "Equal"
value: PLACEMENT_GROUP_IDENTIFIER
effect: "NoSchedule"
Pod toleration によるノードの自動プロビジョニングの詳細については、ワークロードの分離をご覧ください。
次のステップ
- Compute Engine でのインスタンス プレースメント ポリシーの定義について学習する。