我目前正在学习Kubernetes网络。
到目前为止,我所得到的是,我们有CNI插件,它负责处理pod的网络连接——当创建pod时,它们在网络命名空间内创建网络接口,它们为pod设置路由,等等。所以基本上kubernetes将一些网络相关的任务委托给CNI插件。
但是我认为kubernetes可以自己完成部分网络任务。例如,kubernetes为每个节点分配一个podCIDR
。
kubeadm init --pod-network-cidr=192.168.0.0/16 --kubernetes-version=1.24.0
然后当我查看节点时,我看到每个节点都收到了自己的podCIDR
范围,例如:
spec:
podCIDR: 192.168.2.0/24
podCIDRs:
- 192.168.2.0/24
我的问题是:kubernetes如何计算节点的CIDR范围?是否总是为每个节点分配一个/24
子网?
当您为集群配置每个节点的最大pod数时,Kubernetes使用该值为节点分配CIDR范围。根据集群的pod从IP地址范围和节点分配的CIDR范围,可以计算集群的最大节点数。
Kubernetes为每个节点分配一个IP地址范围,一个CIDR块,这样每个Pod可以有一个唯一的IP地址。CIDR块大小对应每个节点的最大pod数
另请参考类似的SO &CIDR范围查看更多信息
kubernetes如何计算节点的CIDR范围?
使用CIDRAllocator
。有多种类型,参见:https://github.com/kubernetes/kubernetes/blob/16534deedf1e3f7301b20041fafe15ff7f178904/pkg/controller/nodeipam/ipam/cidr_allocator.go#L39-L58
例如,RangeAllocator
使用CidrSet.AllocateNext()
方法计算下一个空闲CIDR范围。见:https://github.com/kubernetes/kubernetes/blob/16534deedf1e3f7301b20041fafe15ff7f178904/pkg/controller/nodeipam/ipam/range_allocator.go L274
是否总是为每个节点分配一个/24子网?
这取决于你的配置。这可以通过kube-controller-manager
的命令行参数配置:
--node-cidr-mask-size int32
Mask size for node cidr in cluster. Default is 24 for IPv4 and 64 for IPv6.
--node-cidr-mask-size-ipv4 int32
Mask size for IPv4 node cidr in dual-stack cluster. Default is 24.
--node-cidr-mask-size-ipv6 int32
Mask size for IPv6 node cidr in dual-stack cluster. Default is 64.
看到https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/选项。