集群网络
网络是 Kubernetes 的核心部分,但要准确理解它的工作原理可能颇具挑战。需要解决 4 个不同的网络问题
- 高度耦合的容器到容器通信:这可以通过 Pod 和
localhost
通信来解决。 - Pod 到 Pod 通信:这是本文档的主要重点。
- Pod 到 Service 通信:这在Service 中有所介绍。
- 外部到 Service 通信:这也涵盖在 Service 中。
Kubernetes 的核心在于在不同应用之间共享机器。通常,共享机器需要确保两个应用不会尝试使用相同的端口。在大规模环境下协调多个开发人员的端口是非常困难的,并且会使用户面临超出他们控制范围的集群级别问题。
动态端口分配给系统带来了很多复杂性——每个应用都必须将端口作为参数,API 服务器必须知道如何将动态端口号插入到配置块中,Service 必须知道如何相互查找,等等。Kubernetes 没有处理这些复杂性,而是采用了不同的方法。
要了解 Kubernetes 网络模型,请参阅此处。
Kubernetes IP 地址范围
Kubernetes 集群需要在以下组件配置的可用地址范围内,为 Pod、Service 和 Node 分配互不重叠的 IP 地址
- 网络插件被配置用于为 Pod 分配 IP 地址。
- kube-apiserver 被配置用于为 Service 分配 IP 地址。
- kubelet 或 cloud-controller-manager 被配置用于为 Node 分配 IP 地址。
集群网络类型
根据配置的 IP 族,Kubernetes 集群可分为
- 仅 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、Service 和 Node 对象中存在的 IP 族,而与所表示对象的现有 IP 无关。例如,一个服务器或一个 Pod 的接口上可能有多个 IP 地址,但只有 node.status.addresses
或 pod.status.ips
中的 IP 地址才被视为实现 Kubernetes 网络模型和定义集群类型的依据。
如何实现 Kubernetes 网络模型
网络模型由每个 Node 上的容器运行时实现。最常见的容器运行时使用 容器网络接口 (CNI) 插件来管理其网络和安全能力。许多不同的供应商提供了许多不同的 CNI 插件。其中一些仅提供添加和移除网络接口等基本功能,而其他一些则提供了更复杂的解决方案,例如与其他容器编排系统的集成、运行多个 CNI 插件、高级 IPAM 特性等。
请参阅此页面,以获取 Kubernetes 支持的网络插件(addons)的不完全列表。
接下来
网络模型的早期设计及其原理在网络设计文档中有更详细的描述。关于未来的计划以及旨在改进 Kubernetes 网络的一些持续努力,请参阅 SIG-Network 的 KEPs。