了解 ClusterCIDRConfig 自定义资源

概览

ClusterCIDRConfig 是自定义 CIDR 分配器资源,可让您为 Pod 动态分配更多 IP 地址范围。

IP 地址管理 (IPAM) 可高效利用 IP 子网,同时避免地址范围重叠,防止网络冲突和中断。Kubernetes 为每个节点分配 Pod CIDR,这些 CIDR 用作在该节点上运行的 Pod 的 IP 地址。

当前的 Kubernetes NodeIPAM 存在以下限制:

  • 所有 Pod CIDR 都分配自一个集群 CIDR。创建集群时,您必须指定包含最大集群的整个 IP 地址范围。此限制可能会浪费 IP 地址。

  • 如果增加集群大小,则很难添加更多 IP 地址。

  • 集群 CIDR 是一个大范围。可能很难找到满足集群需求的连续 IP 地址块。

  • 每个节点都有固定大小的集群 IP 地址范围。如果节点的大小和容量不同,则您不能为具有容量较大的给定节点分配较大的 Pod 范围,也不能为容量较低的节点分配较小的范围。这会浪费大量 IP 地址。对于具有许多节点的大型集群,这种浪费会在集群中的所有节点之间增加。

借助 ClusterCIDRConfig 功能,您可以避免向集群分配大型 CIDR 地址块,将集群大小映射到 Pod 的规模,从而保留 IP 地址。您可以通过将 ClusterCIDRConfig 与 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 孤岛(默认) (必填字段)指定 Cluster.spec.clusterNetwork.pods.cidrBlocks
IPv4 平面(默认) Cluster.spec.clusterNetwork.pods.cidrBlocks 将被完全忽略,并且可以跳过。用户必须明确定义 ClusterCIDRConfig(按节点、按节点池和/或按集群)。
双栈(IPv4 孤岛、IPv4 平面)

指定 IPv4 CIDR。

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

指定同时具有 IPv4 和 IPv6 CIDR 的 ClusterCIDRConfig。所有 ClusterCIDRConfig 中配置的 IPv4 CIDR 必须与 Cluster.spec.clusterNetwork.pods.cidrBlocks 中的 IPv4 CIDR 相同,包括 IPv4 的 PerNodeMask 值。如需详细了解 ClusterCIDRConfig 及其用法示例,请参阅示例:双栈(IPv4 孤岛、IPv6 平面)

双栈(平面 IPv4、平面 IPv6) 您可以跳过 Cluster.spec.clusterNetwork.pods.cidrBlocks,因为这些将被完全忽略。您必须同时使用 IPv4 和 IPv6 CIDR 明确定义 ClusterCIDRConfig(按节点、按节点池和/或按集群)。

配置 ClusterCIDRConfig 自定义 CIDR 分配器资源

ClusterCIDRConfig

配置 ClusterCIDRConfig 自定义 CIDR 分配器资源时,请考虑以下几点:

  • 从特定 ClusterCIDRConfig 到节点的 Pod CIDR 分配基于标签选择器。这与用于在节点上调度 Pod 的 nodeSelector 机制类似。

  • 您必须在集群配置 YAML 文件中创建集群期间配置 ClusterCIDRConfig。指定 ClusterCIDRConfig 后,您之后便无法修改这些值。

  • 您可以指定 CIDR 重叠的多个 ClusterCIDRConfig。

  • 如果未找到节点的匹配 ClusterCIDRConfig,则该节点将保持为 NotReady 状态,直到创建具有匹配标签的 ClusterCIDRConfig 为止。

  • 如果最匹配的 ClusterCIDRConfig 没有更多可用于分配的 CIDR,则系统会选择下一个最佳 CIDR,并从可用 CIDR 中分配 Pod CIDR。

  • 对于双栈模型,如果您要将双栈 Pod CIDR 分配给节点,请执行以下操作:

    • 在 ClusterCIDRConfig 中配置 IPv4 和 IPv6 CIDR。

    • 如果配置了多个 ClusterCIDRConfig,请确保所有 ClusterCIDRConfig 都具有双栈 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。 例如,在 25(2^(32-25)=128 个 IP 地址)之前选择 27(2^(32-27)= 32 个 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"}

配置示例

本部分列出了所有网络模式的 Cluster 和 ClusterCIDRConfig 的配置示例。