通过在每个节点上添加具有适当规则的静态路由表,容器网络也可以正常工作。例如,给定三个节点,其中包含三个不同的 docker 桥子网:
node-1(192.168.0.1):
10.0.1.1/24
node-2(192.168.0.2):
10.0.2.1/24
node-3(192.168.0.3):
10.0.3.1/24
在每个节点上添加以下路由:
ip route add 10.0.1.0/24 via 192.168.0.1 dev eth0
ip route add 10.0.2.0/24 via 192.168.0.2 dev eth0
ip route add 10.0.3.0/24 via 192.168.0.3 dev eth0
在 iptables 模式下运行 kube-proxy 时,集群服务-ip 被转换为 pod ip,最后通过路由表路由到相关节点。
那么在路由表上使用 cni 插件有什么好处呢?路由表方法是否存在性能问题?
通过设计,Kubernetes 具有流畅的结构。Pod、服务、节点可以根据需求来来去去,可以通过手动更改(滚动更新、新部署)或自动扩展(HPA、节点自动扩展)来实现。手动设置僵化的网络结构否定了动态 Kubernetes 环境的好处。
默认情况下不需要叠加网络,但是,它们在特定情况下会有所帮助。就像我们没有足够的 IP 空间,或者网络无法处理额外的路由一样。或者,也许当我们想要叠加层提供的一些额外管理功能时。一种常见的情况是,云提供商路由表可以处理的路由数量有限制。例如,AWS 路由表最多支持 50 个路由,而不会影响网络性能。因此,如果我们有超过 50 个 Kubernetes 节点,AWS 路由表将是不够的。在这种情况下,使用覆盖网络会有所帮助。
它本质上是封装一个数据包中的数据包,该数据包跨节点遍历本机网络。您可能不希望使用覆盖网络,因为由于所有数据包的封装-解封装,它可能会导致一些延迟和复杂性开销。它通常是不需要的,所以我们应该只在我们知道为什么需要它时才使用它。
https://itnext.io/an-illustrated-guide-to-kubernetes-networking-part-2-13fdc6c4e24c
如果您担心 CNI 插件造成的延迟和开销,这里有一个方便的 Kubernetes 网络插件的基准测试结果