Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Underlay网络与Overlay网络 #160

Open
heidsoft opened this issue May 24, 2024 · 3 comments
Open

Underlay网络与Overlay网络 #160

heidsoft opened this issue May 24, 2024 · 3 comments

Comments

@heidsoft
Copy link
Owner

heidsoft commented May 24, 2024

_Underlay网络可以被理解为数据中心的基础网络架构,包括所有的物理设备,如交换机、路由器和物理链路等。这些物理设备为数据中心中运行的应用和服务提供了基础的网络连接和数据传输服务。

在数据中心中,underlay网络通常是按照分层的方式进行架构的。最底层是接入层,包括连接到服务器和存储设备的交换机。接下来是汇聚层,它将来自接入层的数据流量进行汇聚并向上一层传输。最上层是核心层,它负责处理来自汇聚层的数据流量,并负责与外部网络的连接。每一层都由一组交换机和路由器组成,这些设备之间通过高速链路进行互连。

在underlay网络之上,可以运行一或多个overlay网络,例如VLAN或VXLAN。这些overlay网络利用underlay网络提供的基础设施,创建出一种虚拟的网络环境,用于隔离不同的应用和服务,或者实现更复杂的网络功能。例如,VXLAN可以创建出在逻辑上跨越整个数据中心的大规模虚拟网络,而这些虚拟网络之间可以完全隔离,避免了相互之间的干扰。

此外,underlay网络还需要提供一些基础服务,例如IP地址管理、路由协议、QoS(Quality of Service,服务质量)控制等。这些服务确保了overlay网络能够正常运行,并且能够满足不同应用的需求。例如,路由协议可以保证数据包能够正确地从源地址传输到目的地址,QoS控制可以确保重要的数据流量能够优先传输。_

@heidsoft
Copy link
Owner Author

VXLAN和VLAN都是用于创建虚拟网络的技术,但是它们在功能,规模和复杂性上存在一些重要的区别。

VLAN(Virtual Local Area Network)是一种在物理网络上创建虚拟局域网的技术。VLAN使用标签来标识和隔离网络流量,从而使网络管理员能够将端口和设备划分到不同的网络中,即使它们在物理上连接到同一台交换机。然而,VLAN的一个重要限制是其标识符只有12位,这意味着最多只能创建4096个不同的VLAN。

VXLAN(Virtual Extensible LAN)是一种新的网络虚拟化技术,旨在克服VLAN的一些限制。VXLAN使用24位的标识符,这意味着它可以支持最多1600万个不同的网络。此外,VXLAN通过在网络上创建一个覆盖网络,使得网络流量可以在数据中心或云环境中的任何地方进行路由,而不仅仅是在同一台物理交换机上。

Underlay网络是指实现网络虚拟化的基础物理网络。在VXLAN和VLAN中,数据包都是在underlay网络上进行传输的。不论是VXLAN还是VLAN,都只是在这个underlay网络上创建了一个虚拟的overlay网络。实际上,overlay网络(无论是VLAN还是VXLAN)和underlay网络是相互独立的,overlay网络上发生的事情不会影响到underlay网络,这使得网络管理员可以更灵活地管理和优化各自的网络环境。

@heidsoft
Copy link
Owner Author

Kubernetes(K8s)使用CNI(Container Network Interface)插件来实现集群中的网络连接。其中,VXLAN是一种网络虚拟化技术,可以解决在不同的网络环境下,如何将Pod的IP互通的问题。K8s通过在各个节点上创建VXLAN隧道,使得跨节点的Pod可以互相访问。

以下是在数据中心的underlay网络上实现K8s VXLAN的步骤:

  1. 首先,需要为每个Kubernetes节点分配一个唯一的VTEP(VXLAN Tunnel Endpoint) IP地址。这个地址通常是节点在underlay网络中的IP地址。

  2. 在K8s集群中,每个节点上的CNI插件会为每个新创建的Pod分配一个IP地址,并在本地VTEP上创建一个新的VXLAN隧道。隧道的目的地址是Pod的目的节点的VTEP IP地址。

  3. 当Pod需要与另一个在不同节点上的Pod通信时,数据包会被封装在一个VXLAN报文中,并通过对应的VXLAN隧道发送出去。当报文到达目的节点后,VTEP会解封装VXLAN报文,并将数据包转发给目的Pod。

  4. 在此过程中,underlay网络只看到标准的IP数据包,不需要知道上层的Pod网络。这样,就可以在数据中心的underlay网络上实现K8s VXLAN。

需要注意的是,这种方式需要underlay网络支持足够大的MTU,以避免由于封装导致的数据包分片。另外,为了实现高效的数据包转发,通常需要在每个节点上维护一个ARP表,用于记录Pod IP地址和对应的VTEP IP地址的映射关系。

在实践中,有一些开源的CNI插件已经实现了VXLAN,如Flannel和Calico,可以直接在K8s集群中使用。

@heidsoft
Copy link
Owner Author

如果你在抓取物理机网卡数据包中看到了Pod IP,那么你的Kubernetes集群可能正在使用一种支持Pod IP直接在物理网络上路由的网络插件,比如Calico、Cilium或者Weave等。

这些网络插件可以配置BGP(边界网关协议),使得Pod IP可以直接在物理网络上被路由,从而避免了NAT转换,提高了网络性能。这种情况下,你在抓取物理网卡数据包时,会看到源IP地址是Pod的IP地址。

不过,请注意,这种网络配置需要你的物理网络设备支持,并且可能需要额外的网络策略来确保网络安全。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant