概览
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 资源支持以下功能:
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 分配给当前节点,请使用以下平局决胜规则。按给定顺序实施这些规则。仅当前一条规则未打破平局时,才实现下一条规则。
选择 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。
例如,在 25(2^(32-25)=128 个 IP 地址)之前选择 27(2^(32-27)= 32 个 IP 地址)。
选择其匹配的 NodeSelector 标签具有较低字母数字值的 ClusterCIDRConfig。例如,选择 {'kubernetes.io/hostname': 'node-1'}
,而不是 {'node.kubernetes.io/instance-type':'medium'}
。
选择其 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 的示例
注意: 这两种平面 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
注意: 这两种平面 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 的示例
注意: 这两种平面 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
注意: 这两种平面 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
注意: 这两种平面 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 的示例
注意: 这两种平面 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