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

このページでは、クラスタ リソースを最適化して Pod に十分なスケジューリング容量を確保するため、Google Kubernetes Engine(GKE)の Standard クラスタでノードあたりの 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 に設定すると、/24 の CIDR 範囲がクラスタのノードに割り当てられます。これにより、そのクラスタには最大 2(24-21) = 23 = 8 個のノードが存在できます。

同様に、Pod のデフォルトの最大数を 8 に設定し、Pod のクラスタのセカンダリ IP アドレス範囲を /21 に設定すると、/28 の 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. ナビゲーション パネルで [ネットワーキング] をクリックします。

  6. [ノードあたりの最大 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 

クラスタ全体で必要な CIDR 範囲が /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 アドレス空間が不足すると、スケジューリング エラーが発生し、クラスタのスケーリングが妨げられる可能性があります。

必要なサイズが不明な場合は、/21(Google Cloud CLI で作成されたクラスタのデフォルト値)のような大きな範囲から始めることをおすすめします。大きな範囲を使用すると、中規模のクラスタに十分な 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)⌉ ceiling 関数(⌈ ⌉)を使用して最も近い整数に切り上げられます。

  • 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 の最大数が 32(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 数を構成できます。

次のステップ