瞭解 ClusterCIDRConfig 自訂資源

總覽

ClusterCIDRConfig 是自訂 CIDR 分配器資源,可讓您動態分配更多 Pod 的 IP 位址範圍。

IP 位址管理 (IPAM) 可有效運用 IP 子網路,並避免位址範圍重疊,防止網路衝突和中斷。Kubernetes 會為每個節點指派 Pod CIDR,做為在該節點上執行的 Pod 的 IP 位址。

目前的 Kubernetes NodeIPAM 有以下限制:

  • 所有 Pod CIDR 都會從一個叢集 CIDR 分配。建立叢集時,您必須指定整個 IP 位址範圍,以容納最大的叢集。這項限制可能會浪費 IP 位址。

  • 如果增加叢集大小,就難以新增更多 IP 位址。

  • 叢集 CIDR 是一個大型範圍。可能難以找到滿足叢集需求的連續 IP 位址區塊。

  • 每個節點都會在叢集內取得固定大小的 IP 範圍。如果節點大小和容量不同,您無法為容量較大的節點分配較大的 Pod 範圍,為容量較小的節點分配較小的範圍。這會浪費大量 IP 位址。如果叢集很大且節點眾多,所有節點加總起來的浪費量就會非常驚人。

透過 ClusterCIDRConfig 功能,您可以避免將大型 CIDR 區塊指派給叢集、將叢集大小對應至 Pod 的規模,進而保留 IP 位址。您可以搭配使用 ClusterCIDRConfigs 和不同組合的 CIDR 和 perNodeMaskSize,節省 IP 位址。ClusterCIDRConfig 資源支援下列項目:

  • 在更精細的層級,為叢集 CIDR 提供多個不連續的 IP CIDR 區塊

  • CIDR 區塊的節點親和性

  • 分配給節點的區塊大小不同

Google Distributed Cloud 在下列功能中使用 ClusterCIDRConfig 功能:

Cluster.spec.clusterNetwork.pods.cidrBlocks 是選用欄位,預設不會定義。如果上述清單中的任何功能未定義此值,您就必須定義。舉例來說,在以 IPv4 島嶼模式建立叢集時,就必須指定這個值,因為系統會將其做為原生路由 CIDR。

下表列出不同網路模式的 ClusterCIDRConfig Cluster.spec.clusterNetwork.pods.cidrBlocks 欄位行為。

網路模式 ClusterCIDRConfig 值
IPv4 Island (預設) (必填欄位) 指定 Cluster.spec.clusterNetwork.pods.cidrBlocks
IPv4 Flat (預設) Cluster.spec.clusterNetwork.pods.cidrBlocks 會完全遭到忽略,而且可以略過。使用者必須明確定義 ClusterCIDRConfigs (每個節點、每個節點集區和/或每個叢集)。
雙重堆疊 (IPv4 Island、IPv4 Flat)

指定 IPv4 CIDR。

請勿在 Cluster.spec.clusterNetwork.pods.cidrBlocks 中指定 IPv6 CIDR。

指定同時包含 IPv4 和 IPv6 CIDR 的 ClusterCIDRConfigs。所有 ClusterCIDRConfig 中設定的 IPv4 CIDR,都必須與 Cluster.spec.clusterNetwork.pods.cidrBlocks 中的 IPv4 CIDR 相同,包括 IPv4 的 PerNodeMask 值。如要進一步瞭解 ClusterCIDRConfig,以及如何使用這項設定的範例,請參閱「範例:雙重堆疊 (IPv4 島狀、IPv6 平面)

雙重堆疊 (扁平 IPv4、扁平 IPv6) 您可以略過 Cluster.spec.clusterNetwork.pods.cidrBlocks,因為系統會完全忽略這些內容。您必須明確定義 ClusterCIDRConfigs (每個節點、每個節點集區和/或每個叢集),並同時使用 IPv4 和 IPv6 CIDR。

設定 ClusterCIDRConfig 自訂 CIDR 分配器資源

ClusterCIDRConfig

設定 ClusterCIDRConfig 自訂 CIDR 分配器資源時,請考量以下幾點:

  • 系統會根據標籤選取器,將特定 ClusterCIDRConfig 的 Pod CIDR 指派給節點。這與用於在節點上排程 Pod 的 nodeSelector 機制類似。

  • 您必須在叢集設定 YAML 檔案中,於叢集建立程序期間設定 ClusterCIDRConfig。指定 ClusterCIDRConfigs 後,即無法修改這些值。

  • 您可以指定多個 ClusterCIDRConfig,其中包含重疊的 CIDR。

  • 如果找不到節點的相符 ClusterCIDRConfig,節點會維持 NotReady 狀態,直到建立具有相符標籤的 ClusterCIDRConfig 為止。

  • 如果最相符的 ClusterCIDRConfig 沒有更多可供分配的 CIDR,系統會選擇次佳的 CIDR,並從可用 CIDR 分配 Pod CIDR。

  • 如果是雙堆疊模型,如要將雙堆疊 Pod CIDR 指派給節點,請執行下列操作:

    • 在 ClusterCIDRConfig 中設定 IPv4 和 IPv6 CIDR。

    • 如果設定了多個 ClusterCIDRConfig,請確保所有 ClusterCIDRConfig 都具有 DualStack CIDR。

    • 確認設定的 IPv4 和 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 指派規則

如要判斷哪個 ClusterCIDRConfig 用於將 Pod CIDR 指派給目前的節點,請使用下列打破僵局的規則。請依指定順序實作這些規則。只有在先前的規則無法打破平手局面時,才需要導入下一個規則。

  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。舉例來說,{'kubernetes.io/hostname': 'node-1'} 會優先於 {'node.kubernetes.io/instance-type':'medium'}

  5. 選取 CIDR IP 值較低的 ClusterCIDRConfig。無論設定是 IPv4 設定還是 DualStack 設定,系統只會比較 IPv4 CIDR。例如 {CIDR: "10.0.0.0/16"} is picked over {CIDR: "192.168.0.0/16"}

設定範例

本節列出所有網路模式的叢集和 ClusterCIDRConfig 設定範例。