我正在尝试进一步了解 Kubernetes 网络。因此,我在 Google Cloud 中部署了一个集群并检查了网络:
gcloud container clusters describe cluster0 | grep -i cidr
clusterIpv4Cidr: 10.20.0.0/14 # --cluster-cidr
nodeIpv4CidrSize: 24
servicesIpv4Cidr: 10.23.240.0/20 # --service-cluster-ip-range
第一个是针对 pod IP:
First IP: 10.20.0.1
Last IP: 10.23.255.254
服务
First IP: 10.23.240.1
Last IP: 10.23.255.254
Pod 范围是否总是包含服务 IP 范围?它们使用相同的网络层吗?
答案1
这是一个很长的故事Kubernetes 网络是由...制作的
Kubernetes 假设 Pod 可以与其他 Pod 通信,无论它们位于哪个主机上。每个 Pod 都有自己的 IP 地址,因此您无需明确创建 Pod 之间的链接,而且几乎无需处理将容器端口映射到主机端口的问题。这创建了一个干净、向后兼容的模型,从端口分配、命名、服务发现、负载平衡、应用程序配置和迁移的角度来看,Pod 可以像虚拟机或物理主机一样处理。
Kubernetes 使用私有和公共可访问 IP 地址。目前还未提及公共 IP 地址。
Kubernetes 使用私有地址池来提供集群内部的通信。每个 Pod 和服务都有一个私有 IP 地址。Kubernetes 中的服务是虚拟的 - 它们由 NAT 创建,而 iptables 会从寻址服务创建到 Pod 的端口重定向。
集群内部通讯的基本规则:
- 所有容器都可以与所有其他容器进行通信,无需 NAT
- 所有节点都可以与所有容器进行通信(反之亦然),无需 NAT 容器认为自己的 IP 与其他容器看到的 IP 相同
关于你的问题:官方Kubernetes 网络 文档指出:
--service-cluster-ip-range ipNet - A CIDR notation IP range from which to assign service cluster IPs. This must not overlap with any IP ranges assigned to nodes for pods.
因此,不建议将服务 IP 与 pod 使用的 IP 放在同一范围内。
我强烈推荐观看有关 Kubernetes 网络的视频 或看着图解指南。
答案2
clusterIpv4Cidr: 10.20.0.0/14 # IP subnet which is configured on all pods.
nodeIpv4CidrSize: 24 # CidrSize which is configured on each node
servicesIpv4Cidr: 10.23.240.0/20 # IP subnet which is configured for Services
从 Pod 的角度来看,所有其他 Pod 和服务都位于同一子网中,因此可以直接访问它们。这意味着不涉及网关配置和路由。顺便说一句,如果服务 IPv4Cider 超出 clusterIPv4Cider 范围,则需要网关配置和路由。这是不同的事情。
因此,我只是猜测,下面的警告告诉 service-cluster-ip-range 不能用于 pod,但它们与 clusterIPv4Cider 范围重叠是可以的。这是有意为之。
“这不能与分配给 Pod 节点的任何 IP 范围重叠。”