Kubernetes 容器网络概念

Posted by Fioncat on May 18, 2023

Kubernetes网络模型定义了一个“扁平”的网络,即:

  • 每个Pod都有一个独立的IP地址
  • 在没有NAT的情况下,每个节点上面的Pod可以跟所有其他节点的Pod通信。

这是一个清晰的,向后兼容的模型,从端口分配、命名、服务发现、负载均衡、应用配置和迁移的角度来说,Pod更像一个独立的虚拟机或物理节点。同时可以使用网络策略来定义网络分段,以限制这些基本网络功能的流量。

在这个模型中,我们可以非常灵活地支持不同的网络实现和环境。具体的实现细节,取决于你如何组合和使用CNI、网络以及cloud provider插件。

CNI插件

CNI(容器网络插件)是一个允许不同网络植入到Kubernetes的标准API。Kubernetes会在每次Pod新建或销毁时调用这个API。有两种类型的CNI插件:

  • CNI网络插件:在Pod创建时,将Pod增加到Kubernetes pod网络中;在Pod销毁时,将Pod从Kubernetes pod网络移除。这包括创建/删除每个pod的网络接口以及将其连接/断开网络的其他细节实现。
  • CNI IPAM插件:负责在Pod创建和销毁时分配和释放IP地址。这可能包括给节点分配一个或某个范围内(CIRDs)的IP地址,或是从底层共有云网络分配IP地址给Pod使用。

Cloud provider 集成

Kubernetes cloud provider是特定于某个云的控制器,它可以配置底层云网络来支持Kubernetes网络。根据cloud provider的不同,这可能包括自动将路由配置到底层云网络中,以让云网络能够原生支持将流量路由到Pod上面。

Kubenet

Kubenet是一个非常基础的,集成到Kubernetes中的网络插件。它没有实现跨节点的网络和网络规则。它一般跟cloud provider一起使用来将路由配置到云供应商的网络中以实现跨节点通信。或仅用于单节点环境。

注意kubenet跟大部分Kubernetes网络(例如Calico)不兼容。

Overlay 网络

Overylay网络是一个在覆盖在另一个网络之上的网络。在Kubernetes的上下文中,一个overlay网络可以被用来处理在某个底层网络的基础上进行跨node的pod之间的网络通信,其中底层网络并不清楚Pod的IP地址以及有哪些Pod运行在哪些节点上面。

Overlay网络将那些底层网络不知道如何处理的数据包(例如使用了Pod IP地址)上面做了一层封装,转换成底层网络知道如何处理的数据包(例如使用了节点IP地址)。两个常见的用来做封装的协议包括VXLAN和IP-in-IP。

Overlay网络的最大优势在于,它减少了对底层网络的依赖。例如,你可以在几乎任何底层网络上面运行一个VXLAN overlay网络,而不必去对底层网络做任何整合或变更。

Overlay网络的劣势在于:

  • 一点额外的性能开销。对数据包封装过程需要消耗少量的CPU资源,并且因为一些额外的字节需要被编码封装到数据包中(VXLAN和IP-in-IP数据头),可以发送的内部数据包的最大大小会被减少,这反过来意味着发送同样的数据可能需要更多的数据包。
  • Pod IP地址在集群外部无法被路由。

集群外Pod IP的路由

不同Kubernetes网络的一个重要区别在于,Pod IP地址是否可以在集群外部跨越更广泛的网络进行路由。

无法路由

如果Pod IP地址无法在集群外部进行路由,当一个Pod尝试跟一个外部IP地址建立网络连接,Kubernetes会使用一个叫做SNAT(网络源地址转换)的技术将连接的源地址从Pod的IP地址改为该Pod宿主的IP地址。这个连接的回包会被自动映射回Pod IP地址。这样Pod就不知道SNAT的存在,连接的对方会将宿主当作连接源,并且底层网络并没有看到Pod IP地址。

如果连接方向是相反的,即集群外部需要跟Pod建立网络连接,就只能通过Kubernetes Services或Ingress来实现了。集群外部没有任何方式来直接访问Pod的IP地址,因为外部不知道Pod IP地址的路由。

可路由

如果Pod IP地址在集群外部是可路由的,Pod就可以访问外部网络而无需SNAT,并且外部网络可以直接访问Pod,而无需Service或Ingress。

外部网络可路由Pod的好处是:

  • 外部连接避免使用SNAT对于更加广泛的安全角度来说至关重要。还可以简化调试过程以及操作日志的理解。
  • 如果有需要不通过Service或Ingress直接访问Pod的需求,那么直接访问可路由的Pod IP会比使用宿主网络的替代方法要简单。

Pod IP地址在集群外部可路由的最大劣势在于,Pod IP在范围更广的网络中必须是唯一的。例如,如果你运行了多个集群,你必须给不同的集群Pod指定不同的IP地址范围(CIDR)。当集群规模变大时,这可能会面临IP地址耗尽的挑战,或是企业对于IP地址空间有其他要求。