ClusterCIDRConfig カスタム リソースについて

概要

ClusterCIDRConfig はカスタム CIDR アロケータ リソースで、Pod により多くの IP アドレス範囲を動的に割り振ることができます。

IP アドレス管理(IPAM)を使用すると、IP サブネットを効率的に使用し、アドレス範囲の重複を回避することが可能になるため、ネットワークの競合や停止を防ぐことができます。Kubernetes はノードごとに Pod CIDR を割り当てます。これは、そのノードで実行されている Pod の IP アドレスとして使用されます。

現在の Kubernetes NodeIPAM には以下の制限があります。

  • すべての Pod CIDR は、1 つのクラスタ CIDR から割り当てられます。クラスタの作成時に、最大のクラスタに対応する IP アドレス範囲全体を指定する必要があります。この制限により、IP アドレスが無駄になる可能性があります。

  • クラスタのサイズを大きくすると、IP アドレスを追加するのが難しくなります。

  • クラスタ CIDR は、1 つの広い範囲です。クラスタのニーズを満たす連続した IP アドレスのブロックを見つけることが難しい場合があります。

  • 各ノードは、クラスタ内の一定規模の IP 範囲を取得します。ノードのサイズと容量がさまざまである場合、容量が大きいノードに大きな Pod 範囲を割り当て、容量の小さいノードに小さい範囲を割り当てることができません。これにより多くの IP アドレスが無駄になります。多数のノードを持つ大規模なクラスタでは、クラスタ内のすべてのノードについてこの無駄が積み重なります。

ClusterCIDRConfig 機能を使用すると、クラスタに大きな CIDR ブロックを割り当てずに、クラスタサイズを Pod のスケールにマッピングできるため、IP アドレスを節約できます。ClusterCIDRConfig を CIDR と perNodeMaskSize のさまざまな組み合わせで使用することで、IP アドレスを節約できます。ClusterCIDRConfig リソースは以下をサポートしています。

  • より細かいレベルでのクラスタ CIDR の不連続な複数の IP CIDR ブロック

  • CIDR ブロックのノード アフィニティ

  • ノードに割り当てられるさまざまなブロックサイズ

ベアメタル版 GKE は、次の機能で ClusterCIDRConfig 機能を使用します。

Cluster.spec.clusterNetwork.pods.cidrBlocks はオプションのフィールドであり、デフォルトでは定義されていません。前述のリストのどの機能でも定義されていない場合は、定義する必要があります。たとえば、クラスタが IPv4 アイランド モードで作成される場合は必要で、ネイティブ ルーティング CIDR として使用されるため指定する必要があります。

次の表に、さまざまなネットワーク モードに対する ClusterCIDRConfig の Cluster.spec.clusterNetwork.pods.cidrBlocks フィールドの動作の使用を示します。

ネットワーク モード ClusterCIDRConfig 値
IPv4 アイランド(デフォルト) (必須項目)Cluster.spec.clusterNetwork.pods.cidrBlocks を指定します。
IPv4 フラット(デフォルト) Cluster.spec.clusterNetwork.pods.cidrBlocks は完全に無視され、スキップできます。ユーザーは ClusterCIDRConfig を(ノードごと、ノードプールごと、クラスタごとに)明示的に定義する必要があります。
デュアルスタック(IPv4 アイランド、IPv4 フラット)

IPv4 CIDR を指定します。

Cluster.spec.clusterNetwork.pods.cidrBlocks には IPv6 CIDR を指定しないでください。

ClusterCIDRConfigs を IPv4 CIDR と IPv6 CIDR の両方で指定します。ClusterCIDRConfig で構成される IPv4 CIDR はすべて、IPv4 の PerNodeMask 値を含む Cluster.spec.clusterNetwork.pods.cidrBlocks の IPv4 CIDR と同じである必要があります。ClusterCIDRConfig の詳細と使用例については、例: デュアルスタック(IPv4 アイランド、IPv6 フラット)をご覧ください。

デュアルスタック(フラット IPv4、フラット IPv6) Cluster.spec.clusterNetwork.pods.cidrBlocks は完全に無視されるため、スキップできます。ClusterCIDRConfigs を(ノードごと、ノードプールごと、クラスタごとに)IPv4 CIDR と IPv6 CIDR の両方で明示的に定義する必要があります。

ClusterCIDRConfig カスタム CIDR アロケータ リソースの構成

ClusterCIDRConfig

ClusterCIDRConfig カスタム CIDR アロケータ リソースを構成する場合は、次の点を考慮してください。

  • 特定の ClusterCIDRConfig からノードへの Pod CIDR の割り当ては、ラベルセレクタに基づいて行われます。これは、ノード上の Pod のスケジューリングに使用される nodeSelector メカニズムに似ています。

  • クラスタ作成プロセス中に、クラスタ構成 YAML ファイルで ClusterCIDRConfig を構成する必要があります。一度 ClusterCIDRConfigs を指定すると後で値を変更することはできません。

  • CIDR が重複する ClusterCIDRConfig を複数指定できます。

  • ノードに一致する ClusterCIDRConfig が見つからない場合、一致するラベルを持つ ClusterCIDRConfig が作成されるまで、ノードは NotReady 状態のままになります。

  • 最もよく一致する ClusterCIDRConfig に割り当て可能な CIDR がない場合は、次に最適な CIDR が選択され、使用可能な CIDR から Pod CIDR が割り当てられます。

  • デュアルスタック モデルで、デュアルスタック Pod の CIDR をノードに割り当てる場合は、以下手順を行います。

    • ClusterCIDRConfig に IPv4 CIDR と IPv6 CIDR の両方を構成します。

    • 複数の ClusterCIDRConfig が構成されている場合は、すべての ClusterCIDRConfig に DualStack CIDR があることを確認します。

    • 構成した IPv4 CIDR と IPv6 CIDR の両方に、ノードごとに同数の割り振り可能な IP アドレスがあることを確認します。

    例: 32 - spec.IPv4.PerNodeMaskSize == 128 - spec.IPv6.PerNodeMaskSize

    spec.IPv4.PerNodeMaskSize = 24

    spec.IPv6.PerNodeMaskSize = 120

    したがって、32 - 24 == 128 - 120 となり、その差は 8 となります。

  • 複数の ClusterCIDRConfig で、nodeSelector のラベルをノードラベルに一致させることができます。

ClusterCIDRConfig 割り当てルール

Pod CIDR を現在のノードに割り当てるためにどの ClusterCIDRConfig を使用するかを決定するには、次のタイブレーク ルールを使用します。これらのルールは指定された順序で実装します。次のルールは、前のルールで決定されない場合にのみ実装します。

  1. NodeSelector がノードのほとんどのラベルと一致する ClusterCIDRConfig を選択します。たとえば、{'node.kubernetes.io/instance-type':'medium', 'rack': 'rack1'} (Match Count: 2){'node.kubernetes.io/instance-type': 'medium'}. (Match Count: 1) より先に選択されます。

  2. 割り当て可能な Pod CIDR が最も少ない ClusterCIDRConfig を選択します。たとえば、{CIDR: "10.0.0.0/16", PerNodeMaskSize: "16"} (1 possible Pod CIDR){CIDR: "192.168.0.0/20", PerNodeMaskSize: "22"} (4 possible Pod CIDRs) より先に選択されます。

  3. PerNodeMaskSize が最も少ない IP アドレスを持つ ClusterCIDRConfig を選択します。たとえば、27(2^(32-27)= 32 個の IP アドレス)は、25(2^(32-25)=128 個の IP アドレス)より先に選択されます。

  4. 一致する NodeSelector ラベルの英数字の値が小さい ClusterCIDRConfig を選択します。たとえば、{'node.kubernetes.io/instance-type':'medium'} よりも {'kubernetes.io/hostname': 'node-1'} が選択されます。

  5. CIDR IP の値が小さい ClusterCIDRConfig を選択します。構成が IPv4 構成か DualStack 構成かに関係なく、IPv4 CIDR のみが比較されます。例: {CIDR: "10.0.0.0/16"} is picked over {CIDR: "192.168.0.0/16"}

設定例

このセクションでは、すべてのネットワーキング モードに対する Cluster と ClusterCIDRConfig の構成例を示します。