8.4 KiB
title | content_type | weight |
---|---|---|
集群网络系统 | concept | 50 |
集群网络系统是 Kubernetes 的核心部分,但是想要准确了解它的工作原理可是个不小的挑战。 下面列出的是网络系统的的四个主要问题:
- 高度耦合的容器间通信:这个已经被 {{< glossary_tooltip text="Pod" term_id="pod" >}}
和
localhost
通信解决了。 - Pod 间通信:这是本文档讲述的重点。
- Pod 与 Service 间通信:涵盖在 Service 中。
- 外部与 Service 间通信:也涵盖在 Service 中。
Kubernetes 的宗旨就是在应用之间共享机器。 通常来说,共享机器需要两个应用之间不能使用相同的端口,但是在多个应用开发者之间 去大规模地协调端口是件很困难的事情,尤其是还要让用户暴露在他们控制范围之外的集群级别的问题上。
动态分配端口也会给系统带来很多复杂度 - 每个应用都需要设置一个端口的参数, 而 API 服务器还需要知道如何将动态端口数值插入到配置模块中,服务也需要知道如何找到对方等等。 与其去解决这些问题,Kubernetes 选择了其他不同的方法。
要了解 Kubernetes 网络模型,请参阅此处。
Kubernetes IP 地址范围
Kubernetes 集群需要从以下组件中配置的可用地址范围中为 Pod、Service 和 Node 分配不重叠的 IP 地址:
- 网络插件配置为向 Pod 分配 IP 地址。
- kube-apiserver 配置为向 Service 分配 IP 地址。
- kubelet 或 cloud-controller-manager 配置为向 Node 分配 IP 地址。
{{< figure src="/zh-cn/docs/images/kubernetes-cluster-network.svg" alt="此图展示了 Kubernetes 集群中不同的网络范围" class="diagram-medium" >}}
集群网络类型
根据配置的 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 的网络模型
网络模型由各节点上的容器运行时来实现。最常见的容器运行时使用 Container Network Interface (CNI) 插件来管理其网络和安全能力。 来自不同供应商 CNI 插件有很多。其中一些仅提供添加和删除网络接口的基本功能, 而另一些则提供更复杂的解决方案,例如与其他容器编排系统集成、运行多个 CNI 插件、高级 IPAM 功能等。
请参阅此页面了解 Kubernetes 支持的网络插件的非详尽列表。
{{% heading "whatsnext" %}}
网络模型的早期设计、运行原理都在联网设计文档里有详细描述。 关于未来的计划,以及旨在改进 Kubernetes 联网能力的一些正在进行的工作,可以参考 SIG Network 的 KEPs。