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