集群网络
网络是 Kubernetes 的核心部分,但要准确理解其工作原理可能具有挑战性。 有 4 个不同的网络问题需要解决
- 高度耦合的容器到容器通信:这通过 Pod 和
localhost
通信来解决。 - Pod 到 Pod 的通信:这是本文档的主要重点。
- Pod 到 Service 的通信:这由 服务覆盖。
- 外部到 Service 的通信:这也由服务覆盖。
Kubernetes 的核心是在应用程序之间共享机器。通常,共享机器需要确保两个应用程序不会尝试使用相同的端口。在多个开发人员之间协调端口在大规模情况下非常困难,并且会将用户暴露于他们无法控制的集群级问题。
动态端口分配给系统带来了很多复杂性——每个应用程序都必须将端口作为标志,API 服务器必须知道如何将动态端口号插入配置块,服务必须知道如何找到彼此等等。Kubernetes 没有处理这个问题,而是采取了不同的方法。
要了解 Kubernetes 网络模型,请参阅此处。
Kubernetes IP 地址范围
Kubernetes 集群需要为 Pod、Service 和 Node 分配不重叠的 IP 地址,这些地址来自以下组件中配置的一系列可用地址
- 网络插件配置为向 Pod 分配 IP 地址。
- kube-apiserver 配置为向 Service 分配 IP 地址。
- kubelet 或云控制器管理器配置为向 Node 分配 IP 地址。
集群网络类型
Kubernetes 集群根据配置的 IP 地址系列,可以分为
- 仅限 IPv4:网络插件、kube-apiserver 和 kubelet/云控制器管理器配置为仅分配 IPv4 地址。
- 仅限 IPv6:网络插件、kube-apiserver 和 kubelet/云控制器管理器配置为仅分配 IPv6 地址。
- IPv4/IPv6 或 IPv6/IPv4 双栈
- 网络插件配置为分配 IPv4 和 IPv6 地址。
- kube-apiserver 配置为分配 IPv4 和 IPv6 地址。
- kubelet 或云控制器管理器配置为分配 IPv4 和 IPv6 地址。
- 所有组件必须就配置的主 IP 系列达成一致。
Kubernetes 集群仅考虑 Pod、Service 和 Node 对象上存在的 IP 系列,而与所表示对象的现有 IP 无关。例如,服务器或 Pod 的接口可以有多个 IP 地址,但只有 node.status.addresses
或 pod.status.ips
中的 IP 地址才会被考虑用于实现 Kubernetes 网络模型并定义集群的类型。
如何实现 Kubernetes 网络模型
网络模型由每个节点上的容器运行时实现。最常见的容器运行时使用 容器网络接口 (CNI) 插件来管理其网络和安全功能。许多不同的供应商提供了许多不同的 CNI 插件。其中一些仅提供添加和删除网络接口的基本功能,而另一些则提供更复杂的解决方案,例如与其他容器编排系统的集成、运行多个 CNI 插件、高级 IPAM 功能等。
有关 Kubernetes 支持的网络插件的非详尽列表,请参阅此页面。
下一步
网络模型的早期设计及其基本原理在网络设计文档中有更详细的描述。有关旨在改进 Kubernetes 网络的未来计划和一些正在进行的努力,请参阅 SIG-Network KEP。