Kubernetes:服务 IP 与 Pod IP 之间的关系

Kubernetes:服务 IP 与 Pod IP 之间的关系

我正在尝试进一步了解 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 范围重叠。”

相关内容