概要
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 リソースは以下をサポートしています。
Google Distributed Cloud は、以下の機能で 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 を使用するかを決定するには、次のタイブレーク ルールを使用します。これらのルールは指定された順序で実装します。次のルールは、前のルールで決定されない場合にのみ実装します。
NodeSelector がノードのほとんどのラベルと一致する ClusterCIDRConfig を選択します。たとえば、{'node.kubernetes.io/instance-type':'medium', 'rack':
'rack1'} (Match Count: 2)
は {'node.kubernetes.io/instance-type': 'medium'}. (Match Count: 1)
より先に選択されます。
割り当て可能な 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)
より先に選択されます。
PerNodeMaskSize が最も少ない IP アドレスを持つ ClusterCIDRConfig を選択します。たとえば、27(2^(32-27)= 32 個の IP アドレス)は、25(2^(32-25)=128 個の IP アドレス)より先に選択されます。
一致する NodeSelector ラベルの英数字の値が小さい ClusterCIDRConfig を選択します。たとえば、{'node.kubernetes.io/instance-type':'medium'}
よりも {'kubernetes.io/hostname': 'node-1'}
が選択されます。
CIDR IP の値が小さい ClusterCIDRConfig を選択します。構成が IPv4 構成か DualStack 構成かに関係なく、IPv4 CIDR のみが比較されます。例: {CIDR: "10.0.0.0/16"} is picked over
{CIDR: "192.168.0.0/16"}
構成例
このセクションでは、すべてのネットワーキング モードに対する Cluster と ClusterCIDRConfig の構成例を示します。
注意: 以下の例はそのまま使用しないでください。アドレス範囲は、ご使用のネットワークに適した値に置き換えてください。
例: IPv4 アイランド モード(デフォルト)
クラスタ構成(デフォルト)
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: bm-cluster
namespace: cluster-default
spec:
...
clusterNetwork:
# Pods specify the IP ranges from which pod networks are allocated.
pods:
cidrBlocks:
- 192.168.0.0/16
services:
cidrBlocks:
- 10.96.0.0/12
... (other cluster config omitted)
例: IPv4 フラットモード
Cluster Config
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: bm-cluster
namespace: cluster-default
spec:
...
clusterNetwork:
flatIPv4: true
services:
cidrBlocks:
- 10.96.0.0/12
... (other cluster config omitted)
ClusterCIDRConfig
例 1: ノードごとに ClusterCIDRConfig を構成する
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: range-node1
namespace: cluster-default # Cluster namespace
spec:
ipv4:
cidr: "222.1.0.0/24"
perNodeMaskSize: 24
nodeSelector:
matchLabels:
kubernetes.io/hostname: node-1
—
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: range-node2
namespace: cluster-default
spec:
ipv4:
cidr: "222.1.1.0/24"
perNodeMaskSize: 24
nodeSelector:
matchLabels:
kubernetes.io/hostname: node-2
—
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: range-node3
namespace: cluster-default
spec:
ipv4:
cidr: "222.1.2.0/24"
perNodeMaskSize: 24
nodeSelector:
matchLabels:
kubernetes.io/hostname: node-3
例 2: NodePool 全体にわたる PodCIDR を指定する
注: 2 つのフラット IP モードには別々の制約があります。
静的フラット IP(BGP なし)の場合: すべてのノードが同じレイヤ 2 ドメインにある場合にのみ使用できます。
動的フラット IP(BGP あり)の場合: ノードが複数のサブドメインにまたがっている場合でも使用できます。
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: nodepool-wide-1
namespace: cluster-default
spec:
ipv4:
cidr: "222.2.0.0/18"
perNodeMaskSize: 24
nodeSelector:
matchLabels:
baremetal.cluster.gke.io/node-pool: workers
例 3: クラスタ全体にわたる PodCIDR を構成 - nodeSelector は構成しない
注: 2 つのフラット IP モードには別々の制約があります。
静的フラット IP(BGP なし)の場合: すべてのノードが同じレイヤ 2 ドメインにある場合にのみ使用できます。
動的フラット IP(BGP あり)の場合: ノードが複数のサブドメインにまたがっている場合でも使用できます。
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: cluster-wide-1
namespace: cluster-default
spec:
ipv4:
cidr: "222.3.0.0/16"
perNodeMaskSize: 24
例: デュアルスタック(IPv4 アイランド、IPv6 フラット)
Cluster Config
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: bm-cluster
namespace: cluster-default
spec:
...
clusterNetwork:
# Pods specify the IP ranges from which pod networks are allocated.
pods:
cidrBlocks:
- 192.168.0.0/16
services:
cidrBlocks:
- 10.96.0.0/12
# Additional IPv6 cidrBlock, determines if the cluster is DualStack
- 2620:0:1000:2630:5:2::/112
... (other cluster config omitted)
ClusterCIDRConfig
例 1: ノードごとに ClusterCIDRConfig を構成する
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: range-node1
namespace: cluster-default # Cluster namespace
spec:
ipv4:
cidr: "192.168.0.0/16"
perNodeMaskSize: 24
ipv6:
cidr: "2222:1::/120"
perNodeMaskSize: 120
nodeSelector:
matchLabels:
kubernetes.io/hostname: node-1
—
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: range-node2
namespace: cluster-default
spec:
ipv4:
cidr: "192.168.0.0/16"
perNodeMaskSize: 24
ipv6:
cidr: "2222:2::/120"
perNodeMaskSize: 120
nodeSelector:
matchLabels:
kubernetes.io/hostname: node-2
—
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: range-node3
namespace: cluster-default
spec:
ipv4:
cidr: "192.168.0.0/16"
perNodeMaskSize: 24
ipv6:
cidr: "2222:3::/120"
perNodeMaskSize: 120
nodeSelector:
matchLabels:
kubernetes.io/hostname: node-3
例 2: NodePool 全体にわたる PodCIDR を指定する
注: 2 つのフラット IP モードには別々の制約があります。
静的フラット IP(BGP なし)の場合: すべてのノードが同じレイヤ 2 ドメインにある場合にのみ使用できます。
動的フラット IP(BGP あり)の場合: ノードが複数のサブドメインにまたがっている場合でも使用できます。
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: nodepool-wide-1
namespace: cluster-default
spec:
ipv4:
cidr: "192.168.0.0/16"
perNodeMaskSize: 24
ipv6:
cidr: "2222:3::/112"
perNodeMaskSize: 118
nodeSelector:
matchLabels:
baremetal.cluster.gke.io/node-pool: workers
例 3: クラスタ全体にわたる PodCIDR を構成 - nodeSelector は構成しない
注: 2 つのフラット IP モードには別々の制約があります。
静的フラット IP(BGP なし)の場合: すべてのノードが同じレイヤ 2 ドメインにある場合にのみ使用できます。
動的フラット IP(BGP あり)の場合: ノードが複数のサブドメインにまたがっている場合でも使用できます。
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: cluster-wide-1
namespace: cluster-default
spec:
ipv4:
cidr: "192.168.0.0/16"
perNodeMaskSize: 24
ipv6:
cidr: "2222:3::/112"
perNodeMaskSize: 120
例: デュアルスタック(IPv4 フラット、IPv6 フラット)
Cluster Config
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: bm-cluster
namespace: cluster-default
spec:
...
clusterNetwork:
flatIPv4: true
services:
cidrBlocks:
- 10.96.0.0/12
# Additional IPv6 cidrBlock, determines if the cluster is DualStack
- 2620:0:1000:2630:5:2::/112
... (other cluster config omitted)
ClusterCIDRConfig
例 1: ノードごとに ClusterCIDRConfig を構成する
注: 2 つのフラット IP モードには別々の制約があります。
静的フラット IP(BGP なし)の場合: すべてのノードが同じレイヤ 2 ドメインにある場合にのみ使用できます。
動的フラット IP(BGP あり)の場合: ノードが複数のサブドメインにまたがっている場合でも使用できます。
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: range-node1
namespace: cluster-default # Cluster namespace
spec:
ipv4:
cidr: "222.1.0.0/24"
perNodeMaskSize: 24
ipv6:
cidr: "2222:1::/120"
perNodeMaskSize: 120
nodeSelector:
matchLabels:
kubernetes.io/hostname: node-1
—
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: range-node2
namespace: cluster-default
spec:
ipv4:
cidr: "222.1.1.0/24"
perNodeMaskSize: 24
ipv6:
cidr: "2222:2::/120"
perNodeMaskSize: 120
nodeSelector:
matchLabels:
kubernetes.io/hostname: node-2
—
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: range-node3
namespace: cluster-default
spec:
ipv4:
cidr: "222.1.2.0/24"
perNodeMaskSize: 24
ipv6:
cidr: "2222:3::/120"
perNodeMaskSize: 120
nodeSelector:
matchLabels:
kubernetes.io/hostname: node-3
例 2: NodePool 全体にわたる PodCIDR を指定する
注: 2 つのフラット IP モードには別々の制約があります。
静的フラット IP(BGP なし)の場合: すべてのノードが同じレイヤ 2 ドメインにある場合にのみ使用できます。
動的フラット IP(BGP あり)の場合: ノードが複数のサブドメインにまたがっている場合でも使用できます。
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: nodepool-wide-1
namespace: cluster-default
spec:
ipv4:
cidr: "222.2.0.0/18"
perNodeMaskSize: 24
ipv6:
cidr: "2222:3::/112"
perNodeMaskSize: 118
nodeSelector:
matchLabels:
baremetal.cluster.gke.io/node-pool: workers
例 3: クラスタ全体にわたる PodCIDR を構成 - nodeSelector は構成しない
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: cluster-wide-1
namespace: cluster-default
spec:
ipv4:
cidr: "222.3.0.0/16"
perNodeMaskSize: 24
ipv6:
cidr: "2222:3::/112"
perNodeMaskSize: 120