ノードあたりの最大 Pod 数を構成する

このページでは、Google Kubernetes Engine(GKE)の Standard クラスタでノードあたりの Pod の最大数を構成して、クラスタ リソースを最適化し、Pod に十分なスケジューリング容量を確保する方法について説明します。このページでは、Pod、CIDR ブロックサイズ、ノード数の関係が、GKE が Pod をスケジュールし、クラスタ内の IP アドレスを割り振る方法にどのように影響するかについて説明します。このページには、ノードあたりの最大 Pod 数に関する制限とデフォルト値の詳細も含まれています。

このページは、クラウド リソースのプロビジョニングと構成、アプリとサービスのデプロイ、クラウド デプロイのネットワーキングの管理を行うオペレーター、クラウド アーキテクト、デベロッパー、ネットワーク エンジニアを対象としています。 Google Cloudのコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールとタスクをご覧ください。

このページを読む前に、Autopilot クラスタではなく GKE Standard クラスタを使用する場合Kubernetes ネットワーキング モデルについて理解しておいてください。

始める前に

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

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。

制限事項

  • VPC ネイティブ クラスタでは、ノードあたりの最大 Pod 数のみ構成できます。
  • ノードの作成は、Pod のアドレス範囲内の使用可能なアドレスの数に限定されます。Pod のアドレス範囲のデフォルト サイズ、最小サイズ、最大サイズについては、IP アドレス範囲の計画表をご覧ください。また、不連続マルチ Pod CIDR を使用して、Pod の IP アドレスを追加することもできます。
  • 各クラスタでは、kube-system Namespace に kube-proxy などの kube-system Pod を作成する必要があります。ノードあたりの最大 Pod 数を減らす場合は、ワークロード Pod とシステム Pod の両方を考慮する必要があります。クラスタ内のシステム Pod を一覧表示するには、次のコマンドを実行します。

    kubectl get pods --namespace kube-system
    

ノードあたりの最大 Pod 数を構成する

クラスタの作成時またはノードプールの作成時に、Standard クラスタのノードあたりの最大 Pod 数を構成できます。クラスタまたはノードプールの作成後に、この設定を変更することはできません。Autopilot クラスタの場合、ノードの最大数は事前構成済みで不変です。

ただし、Pod の IP アドレスが不足している場合は、不連続マルチ Pod CIDR を使用して、Pod の IP アドレス範囲を追加作成できます。

クラスタの作成時に Pod アドレス範囲のサイズを設定するには、gcloud CLI または Google Cloud コンソールを使用します。

gcloud

gcloud CLI を使用してノードあたりのデフォルトの最大 Pod 数を設定するには、次のコマンドを実行します。

gcloud container clusters create CLUSTER_NAME \
    --enable-ip-alias \
    --cluster-ipv4-cidr=10.0.0.0/21 \
    --services-ipv4-cidr=10.4.0.0/19 \
    --create-subnetwork=name='SUBNET_NAME',range=10.5.32.0/27 \
    --default-max-pods-per-node=MAXIMUM_PODS \
    --location=COMPUTE_LOCATION

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

  • CLUSTER_NAME: 新しいクラスタの名前。
  • SUBNET_NAME: クラスタの新しいサブネットワークの名前。
  • MAXIMUM_PODS: クラスタのノードあたりのデフォルトの最大 Pod 数。256 まで構成できます。省略した場合は、Kubernetes によってデフォルト値の 110 が割り当てられます。
  • COMPUTE_LOCATION: 新しいクラスタの Compute Engine のロケーション

コンソール

  1. Google Cloud コンソールで、[Kubernetes クラスタを作成する] ページに移動します。

    [Kubernetes クラスタの作成] に移動

  2. 新しいクラスタを構成します。

  3. ナビゲーション パネルの [クラスタ] の下の [ネットワーキング] をクリックします。

  4. [VPC ネイティブのトラフィック ルーティングを有効にする(エイリアス IP を使用)] チェックボックスが選択されていることを確認します。

  5. ナビゲーション パネルで、[ノードプール] の下の [ノード] をクリックします。

  6. [ノードあたりの最大 Pod 数] フィールドを 110 に設定します。GKE はこの値を使用して、ノードに割り当てられている IP アドレス範囲のサイズを調整します。

  7. [作成] をクリックします。

クラスタのノードあたりの最大 Pod 数を構成すると、Kubernetes はこの値を使用してノードに CIDR の範囲を割り当てます。Pod のクラスタのセカンダリ IP アドレス範囲とノードに割り当てられた CIDR の範囲に基づいて、クラスタの最大ノード数を計算できます。

たとえば、Pod のデフォルトの最大数を 110 に設定し、Pod のセカンダリ IP アドレス範囲を /21 に設定すると、Kubernetes は /24 の CIDR 範囲をクラスタのノードに割り当てます。CIDR 範囲の割り当てにより、クラスタに最大 2(24-21) = 23 = 8 個のノードが存在できるようになります。

同様に、Pod のデフォルトの最大数を 8 に設定し、Pod のクラスタのセカンダリ IP アドレス範囲を /21 に設定すると、Kubernetes は /28 の CIDR 範囲をノードに割り当てます。CIDR 範囲の割り当てにより、クラスタに最大 2(28-21) = 27 = 128 個のノードが存在できるようになります。

既存のクラスタの新しいノードプールで Pod の最大数を構成する

既存の Standard クラスタにノードプールを作成するときに、ノードあたりの最大 Pod 数を指定することもできます。新しいノードプールを作成すると、クラスタレベルでノードあたりのデフォルトの最大 Pod 数が構成されていない既存のクラスタでも、IP アドレスの割り振りを最適化できます。

ノードプール レベルで Pod の最大数を設定すると、クラスタレベルのデフォルトの最大値がオーバーライドされます。ノードプールの作成時にノードあたりの最大 Pod 数を構成しない場合は、クラスタレベルの最大数が適用されます。

gcloud

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --max-pods-per-node=MAXIMUM_PODS

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

  • POOL_NAME: 新しいノードプールの名前。
  • CLUSTER_NAME: ノードプールを作成するクラスタの名前。
  • MAXIMUM_PODS: ノードプール内の Pod の最大数。

コンソール

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. [ノードプールを追加] をクリックします。

  4. ナビゲーション パネルで [ノード] をクリックします。

  5. [ネットワーキング] で、[ノードあたりの最大 Pod 数] フィールドに値を入力します。GKE はこの値を使用して、ノードに割り当てられている IP アドレス範囲のサイズを調整します。

Pod のセカンダリ範囲とノードあたりの最大 Pod 数

ノードあたりの最大 Pod 数を構成すると、Pod セカンダリ範囲の必要なサイズに間接的に影響します。GKE では、ノードプールごとに最小 /24 の CIDR ブロックが必要です。ノードプールの作成時に /24 より小さい Pod セカンダリ範囲を指定しようとすると、次のエラーが発生します。

Pod secondary range 'Pod' must have a CIDR block of at least /24

クラスタ全体で /24 より小さい範囲が必要な場合は、Google Cloud CLI で --cluster-ipv4-cidr 引数を使用してクラスタレベルで指定できます。詳細については、特定の CIDR の範囲でクラスタを作成するをご覧ください。連続していないマルチ Pod CIDR を使用して、クラスタに Pod の IP アドレス範囲を追加することもできます。

各クラスタでは、kube-system Namespace に kube-proxy などの kube-system Pod を作成する必要があります。ノードあたりの最大 Pod 数を構成する際は、ワークロード Pod とシステム Pod の両方を考慮する必要があります。

ノードあたりのデフォルトの最大 Pod 数について

デフォルトでは、GKE は Standard クラスタでノードあたり最大 110 の Pod が可能ですが、Standard クラスタはノードあたり最大 256 の Pod が可能になるように構成できます。Autopilot クラスタは、予想されるワークロード Pod の密度に基づいて、ノードあたりの最大 Pod 数を 8~256 の範囲から選択します。Kubernetes は、各 Pod に一意の IP アドレスが指定されるように、各ノードに IP アドレスの範囲(CIDR ブロック)を割り当てます。CIDR ブロックのサイズは、ノードあたりの最大 Pod 数に対応します。

Standard クラスタの Pod の CIDR 範囲

Standard クラスタで、デフォルトの 1 ノードあたり最大 110 個の Pod の場合、Kubernetes は各ノードに /24 CIDR ブロック(256 アドレス)を割り当てます。ノードで作成できる Pod の最大数の 2 倍以上の利用可能な IP アドレスを指定することで、ノードの Pod が追加 / 削除される際、Kubernetes による IP アドレスの再利用を抑制できます。

ノードあたりの Pod 数は 256 がハードリミットですが、ノードの Pod 数は減らすことができます。ノードに割り当てられる CIDR ブロックのサイズは、ノードあたりの最大 Pod 数によって異なります。ブロックには、ノードあたりの最大 Pod 数の少なくとも 2 倍のアドレス範囲があります。

次の表では、ノードあたりの最大 Pod 数別に、CIDR ブロックのサイズと、Kubernetes がノードに割り振る IP アドレスの最大数を示します。

ノードあたりの最大 Pod 数 ノードあたりの CIDR 範囲 IP アドレスの数
8 /28 16
9~16 /27 32
17~32 /26 64
33~64 /25 128
65~128 /24 256
129~256 /23 512

Pod のセカンダリ IP アドレス範囲に関するクラスタのサイズ設定の考慮事項

クラスタを作成すると、Pod のセカンダリ IP アドレス範囲のサイズは変更できません。現在と将来のワークロードのニーズに対応できるように、この範囲のサイズを慎重に計画する必要があります。Pod の IP アドレス空間が不足すると、スケジューリング エラーが発生し、クラスタのスケーリングが妨げられる可能性があります。

必要なサイズがわからない場合は、Google Cloud CLI で作成されたクラスタのデフォルトである /21 など、大きな範囲から始めることをおすすめします。範囲を大きくすると、中規模のクラスタに十分な IP アドレスが提供され、将来の成長に対応する柔軟性が得られます。Pod の IP アドレスが不足した場合は、不連続マルチ Pod CIDR を使用して、Pod の IP アドレス範囲を追加できます。

ただし、IP アドレス空間が制約されている環境で作業している場合は、より小さい範囲を使用する必要がある場合があります。このような場合は、ノードあたりの Pod の最大数を減らすことができます。ノードあたりの最大 Pod 数を減らすと、各ノードの Pod CIDR 範囲が小さくなり、クラスタ全体の Pod セカンダリ範囲が小さくても、より多くのノードを収容できます。この構成は、ノードあたりの Pod 密度とクラスタ内のノードの総数のトレードオフです。

クラスタがサポートできる Pod の最大数を計算するには、ノードあたりの Pod 数と CIDR 範囲の入力値を指定します。GKE はこれらの入力を使用して、ノードと Pod のアドレス範囲のサイズを決定します。

ユーザー指定の値

これらは、クラスタまたはノードプールの作成時に指定する値です。

  • Q: ノードあたりの Pod の最大数。
    • Autopilot クラスタの場合、Q は固定されています(現在は 32)。
    • Standard クラスタの場合は、Q を構成できます。
  • DS: Pod サブネットのプレフィックス長。たとえば、CIDR 範囲が /17 の場合、プレフィックス長は 17 です。
  • S: プライマリ サブネットの接頭辞長。たとえば、CIDR 範囲が /24 の場合、プレフィックス長は 24 です。

計算値

GKE は、入力に基づいて次の値を計算します。

  • M: 各ノードの Pod 範囲のネットマスク サイズ。none M = 31 - ⌈log₂(Q)⌉ 天井関数(⌈ ⌉)を使用して、最も近い整数に切り上げます。

  • HM: ノードの Pod 範囲ネットマスクのホストビット数。none HM = 32 - M

  • HD: 選択した CIDR Pod サブネット ネットマスクのホストビット数。 none HD = 32 - DS

  • MN: Pod サブネットでサポートできるノードの最大数。none MN = 2^(HD - HM)

  • MP: Pod サブネットでサポートできる Pod の最大数。none MP = MN * Q

  • N: プライマリ範囲で使用可能な IP アドレスの数。none N = 2^(32-S) - 4

注意事項:

  • セカンダリ範囲内のすべての IP アドレスを Pod に使用できます。
  • これらの計算は、理論上の最大値を求めます。実際のパフォーマンスは他の要因の影響を受ける可能性があります。

例:

次のように GKE Autopilot クラスタを作成するとします。

  • Pod サブネット CIDR が /17DS = 17)。
  • ノードあたりの Pod の最大数(Q = 32)。

Pod の最大数を計算します。

  1. M = 31 - ⌈log₂(32)⌉ = 26
  2. HM = 32 - 26 = 6
  3. HD = 32 - 17 = 15
  4. MN = 2(15 - 6) = 512
  5. MP = 512 * 32 = 16,384

このクラスタは、最大 512 個のノードと 16,384 個の Pod をサポートできます。

Pod の最大数を減らす

ノードあたりの最大 Pod 数を減らすと、IP アドレス空間全体の各ノードに必要な部分が少なくなるため、クラスタにより多くのノードを指定できます。あるいは、クラスタの作成時に Pod により小さい IP アドレス空間を指定すると、クラスタ内で同じ数のノードをサポートできます。

ノードあたりの最大 Pod 数を減らすと、必要な IP アドレスが少ない、より小さなクラスタを作成することもできます。たとえば、ノードあたりの Pod 数が 8 の場合、各ノードに /28 CIDR が付与されます。これらの IP アドレス範囲と、定義したサブネットとセカンダリ範囲によって、クラスタを正常に作成するために必要な IP アドレスの数が決まります。

クラスタの作成時およびノードプールの作成時にノードあたりの最大 Pod 数を構成できます。

次のステップ