k8s网络详解(一)

目录

网络概述

Pod 网络通信

Overlay网络

原理

在k8s中的作用

VXLAN

网络插件Flanne

Flannel UDP 模式的工作原理

ETCD和Flannel之间的关系

VXLAN 模式

Flannel VXLAN模式跨主机工作原理

网络插件 Calico

k8s 组网Calico方案与flannel方案区别

Calico 主要组成部分

Calico 工作原理


网络概述

Kubernetes网络模型是一个复杂的系统,它涉及多个组件和概念。

  • Pod网络: 在Kubernetes中,最基本的网络单元是Pod。Pod是一组紧密关联的容器,它们共享相同的网络命名空间和IP地址。Pod内的容器可以通过localhost进行通信,它们可以使用相同的端口进行通信,就像在同一台主机上运行的进程一样。

  • 容器网络接口(CNI): 容器网络接口(CNI)是Kubernetes网络插件的标准接口。CNI定义了一组规范,用于创建、配置和删除容器的网络接口。Kubernetes使用CNI插件来管理Pod的网络。

  • 网络插件: Kubernetes提供了多种网络插件,用于实现Pod之间的网络通信。这些插件可以根据需求选择和配置。一些常见的网络插件包括Flannel、Calico、Weave和Cilium。每个插件都有自己的特点和功能,可以根据具体的需求选择适合的插件。

  • Overlay网络: Overlay网络是一种虚拟网络,它在底层物理网络之上创建了一个逻辑网络。在Kubernetes中,Overlay网络用于在不同的节点上创建Pod之间的通信通道。Overlay网络可以通过隧道技术将数据包封装在底层网络中进行传输。

  • 服务发现和负载均衡: Kubernetes提供了服务发现和负载均衡的功能,以便于在集群中访问和管理服务。通过使用Service对象,可以为一组Pod创建一个虚拟的负载均衡器,并为其分配一个唯一的虚拟IP地址。这样,其他的Pod或外部用户可以通过该虚拟IP地址访问服务。

  • 网络策略: Kubernetes还提供了网络策略的功能,用于控制Pod之间的网络流量。网络策略可以定义允许或禁止特定的流量规则,以增强网络安全性和隔离性。通过网络策略,可以限制Pod之间的通信,只允许特定的流量通过。

总结起来,Kubernetes网络模型是一个复杂的系统,它涉及到Pod网络、容器网络接口(CNI)、网络插件、Overlay网络、服务发现和负载均衡、网络策略等多个方面。这些组件和概念共同工作,为Kubernetes集群中的容器提供了可靠的网络通信和管理能力。

Pod 网络通信

它涉及到Pod内部容器之间的通信以及Pod之间的跨节点通信。

  • Pod内部容器通信: 在同一个Pod内部的容器可以通过localhost进行通信。它们可以使用相同的IP地址和端口进行通信,就像在同一台主机上运行的进程一样。这种通信方式非常高效,因为它们直接共享相同的网络命名空间。

  • 同一个节点内Pod之间的通信: 每个Pod都有一个真实的全局IP地址,因此在同一个节点内的不同Pod之间可以直接使用对方Pod的IP地址进行通信。这是因为它们都通过Veth连接到同一个docker0/cni0网桥,具有相同的网段,所以它们之间可以直接通信。

  • 不同节点上Pod之间的通信: 不同节点上的Pod之间的通信需要通过宿主机的物理网卡进行。Pod的IP地址与docker0网桥处于同一网段,而docker0网桥的网段与宿主机的物理网卡是不同的。为了实现不同节点上Pod之间的通信,需要满足两个条件:确保Pod的IP不冲突,并将Pod的IP与所在节点的IP关联起来,通过这种关联让不同节点上的Pod可以直接通过内网IP地址进行通信。

  • Pod之间的跨节点通信: 当Pod部署在不同的节点上时,需要通过网络进行通信。Kubernetes提供了多种方式来实现Pod之间的跨节点通信。

  • Overlay网络: Overlay网络是一种虚拟网络,它在底层物理网络之上创建了一个逻辑网络。Kubernetes使用Overlay网络来实现Pod之间的跨节点通信。在Overlay网络中,数据包会被封装在底层网络中进行传输,从而实现跨节点的通信。

  • 网络插件: Kubernetes提供了多种网络插件,如Flannel、Calico、Weave和Cilium等,用于实现Pod之间的跨节点通信。这些插件可以根据需求选择和配置。它们使用不同的技术和协议来建立跨节点的通信通道,如VXLAN、IPsec、BGP等。

  • 服务代理: Kubernetes还提供了服务代理的方式来实现Pod之间的跨节点通信。通过创建一个Service对象,可以为一组Pod创建一个虚拟的负载均衡器,并为其分配一个唯一的虚拟IP地址。其他的Pod或外部用户可以通过该虚拟IP地址访问服务,从而实现跨节点的通信。

总结起来,为了实现这种关联,Kubernetes使用网络插件和网络解决方案,如Flannel、Calico、Weave和Cilium等。这些插件和解决方案使用不同的技术和协议来建立跨节点的通信通道,例如VXLAN、IPsec和BGP等。它们确保Pod的IP地址不冲突,并通过网络路由和转发来实现不同节点上Pod之间的直接通信。

Pod内部容器之间的通信可以通过localhost进行,同一个节点内的Pod之间可以直接使用对方的IP地址进行通信,而不同节点上的Pod之间的通信需要通过宿主机的物理网卡进行,并通过网络插件和解决方案来实现IP地址的关联和路由。这样,Kubernetes可以实现跨节点的Pod网络通信。

Overlay网络

原理

  • Overlay网络是一种在二层或三层基础网络之上叠加的虚拟网络技术模式。它通过在原始报文外再封装一层四层协议(通常是UDP协议),通过虚拟链路隧道将主机连接起来。

  • Overlay网络的主要目的是解决跨网络和跨数据中心的通信需求。它可以在现有的基础网络之上创建一个虚拟网络,使得位于不同物理网络中的主机能够直接通信,就像它们在同一网络中一样。

  • 在Overlay网络中,数据包被封装在底层网络的数据包中进行传输。这个封装过程通常使用隧道技术,将原始数据包添加一个额外的头部,其中包含了源和目标节点的信息。这样,数据包就可以在底层网络中传输,同时保持Overlay网络的逻辑隔离。

  • 目前,Overlay网络主要采用VXLAN(Virtual Extensible LAN)技术。VXLAN使用UDP封装数据包,并通过虚拟网络标识符(VNI)来标识不同的Overlay网络。VXLAN可以扩展虚拟局域网(VLAN)的数量,提供更大的可扩展性和灵活性。

  • 然而,Overlay网络的性能可能会受到一定的损耗,主要体现在对原始报文的修改和额外的封装开销上。这可能会导致一些性能上的影响,例如增加延迟和带宽消耗。因此,在设计和实施Overlay网络时,需要权衡性能和灵活性之间的取舍。

总结起来,Overlay网络是一种在二层或三层基础网络之上叠加的虚拟网络技术模式。它通过封装和隧道技术,在原始报文外再添加一层四层协议,通过虚拟链路隧道将主机连接起来。目前主要采用VXLAN技术。尽管Overlay网络可能会带来一定的性能损耗,但它提供了跨网络和跨数据中心通信的灵活性和可扩展性。

在k8s中的作用

在Kubernetes(k8s)中,Overlay网络是一种常用的网络模型,用于实现跨节点的容器通信。它通过在底层网络之上创建虚拟网络来连接不同节点上的Pod,使它们能够直接通信。

  • Overlay网络插件: 在k8s中,使用网络插件来实现Overlay网络。这些插件负责创建和管理Overlay网络,以及为Pod分配虚拟IP地址。一些常见的Overlay网络插件包括Flannel、Calico、Weave和Cilium等。

  • 虚拟网络和隧道技术: Overlay网络使用虚拟网络来连接不同节点上的Pod。它通过封装和隧道技术将数据包封装在底层网络的数据包中进行传输。这样,Pod可以使用虚拟IP地址进行通信,而不需要了解底层物理网络的细节。

  • 路由和转发: 在Overlay网络中,路由和转发是实现跨节点通信的关键。每个节点上的网络插件负责维护路由表和转发规则,以确保数据包能够正确地从源节点转发到目标节点。

  • 虚拟网络标识符(VNI): Overlay网络使用虚拟网络标识符(VNI)来标识不同的虚拟网络。每个虚拟网络都有一个唯一的VNI,用于区分不同的Overlay网络。

  • 网络策略: k8s还提供了网络策略的功能,用于控制Overlay网络中的流量。网络策略可以定义允许或禁止特定流量规则,以增强网络的安全性和隔离性。通过网络策略,可以限制Pod之间的通信,只允许特定的流量通过。

总结起来,k8s中的Overlay网络是一种常用的网络模型,用于实现跨节点的容器通信。它通过虚拟网络、隧道技术、路由和转发等机制,将不同节点上的Pod连接起来,使它们能够直接通信。Overlay网络插件负责创建和管理Overlay网络,而网络策略可以用于控制流量。这样,k8s可以提供可靠的容器网络通信和管理能力。

VXLAN

VXLAN(Virtual Extensible LAN)是一种Overlay网络技术,它通过在底层网络中封装数据包,并使用UDP作为封装协议,将数据包传输到目的地。下面是对VXLAN的工作原理的详细解析:

  • 封装过程: 当源主机发送数据包时,VXLAN会将原始数据包封装在UDP数据包中。在封装过程中,VXLAN会添加一个额外的头部,其中包含了源和目标的IP地址、MAC地址以及VNI(Virtual Network Identifier)等信息。这个封装过程使得数据包能够在底层网络中进行传输。

  • 传输过程: 封装后的数据包会通过底层网络(通常是以太网)进行传输。由于数据包已经被封装在UDP数据包中,因此它们可以通过底层网络的路由和转发机制进行传输。在传输过程中,底层网络的IP地址和MAC地址被用作外层报文头。

  • 解封装过程: 当数据包到达目的地时,VXLAN隧道端点会解封装数据包,将原始数据包提取出来,并将其发送给目标地址。解封装过程会去除VXLAN头部,还原原始数据包。

通过VXLAN的封装和解封装过程,源主机和目标主机之间可以通过底层网络进行通信,而不需要了解底层网络的细节。VXLAN使用UDP作为封装协议,使得它可以在现有的网络设备和技术上运行,而不需要对底层网络进行修改。

VXLAN的优点包括:

  • 扩展性:VXLAN可以扩展虚拟局域网(VLAN)的数量,提供更大的可扩展性,适用于大规模的网络部署。

  • 灵活性:VXLAN可以在现有的基础网络上运行,与不同类型的网络设备和技术兼容。

  • 逻辑隔离:VXLAN可以提供逻辑隔离,使得不同的虚拟网络之间相互隔离,增强了网络的安全性和隔离性。

需要注意的是,封装和解封装过程会对原始数据包进行修改,这可能会带来一定的性能开销。因此,在设计和实施VXLAN时,需要权衡性能和灵活性之间的取舍。

总结起来,VXLAN是一种Overlay网络技术,通过在底层网络中封装数据包,并使用UDP作为封装协议,实现了源数据包的传输。它具有扩展性、灵活性和逻辑隔离的优点,适用于大规模网络部署。然而,封装和解封装过程可能会带来一定的性能开销,需要在实际应用中进行评估和权衡。

网络插件Flanne

Flannel是一个网络插件,旨在为Kubernetes集群中的不同节点上的Docker容器提供全局唯一的虚拟IP地址。

Flannel使用Overlay网络技术,将TCP源数据包封装在另一种网络包中进行路由转发和通信。它支持多种数据转发方式,包括UDP、VXLAN和Host-gw。

  • UDP模式: 在UDP模式下,Flannel使用UDP封装数据包,并通过底层网络进行路由转发。源数据包被封装在UDP数据包中,然后通过网络传输到目标节点,目标节点再解封装数据包并将其传递给目标容器。

  • VXLAN模式: 在VXLAN模式下,Flannel使用VXLAN封装数据包,并通过底层网络进行路由转发。VXLAN是一种基于UDP的Overlay网络协议,它可以扩展虚拟局域网(VLAN)的数量。Flannel使用VXLAN来创建一个虚拟网络,将不同节点上的容器连接起来。

  • Host-gw模式: 在Host-gw模式下,Flannel使用主机的路由表进行通信。它将目标容器的虚拟IP地址添加到主机的路由表中,使得主机可以直接将数据包转发给目标容器,而无需进行封装和解封装的过程。

通过这些数据转发方式,Flannel实现了在Kubernetes集群中不同节点上的Docker容器之间的通信。它为每个容器分配一个全局唯一的虚拟IP地址,使得容器可以直接通过这个虚拟IP地址进行通信,而不需要了解底层网络的细节。

需要注意的是,Flannel的选择和配置取决于具体需求和环境。可以根据集群的规模、网络性能和安全性要求来选择合适的数据转发方式。

总结起来,Flannel是一个网络插件,通过使用Overlay网络技术和不同的数据转发方式(如UDP、VXLAN和Host-gw),为Kubernetes集群中的不同节点上的Docker容器提供全局唯一的虚拟IP地址。它使得容器之间的通信更加简单和可靠。

Flannel UDP 模式的工作原理

  • 在Flannel UDP模式下,数据从主机A上的源容器发出后,经过所在主机的docker0/cni0网络接口转发到flannel0接口,而flanneld服务则监听在flannel0虚拟网卡的另一端。

  • Flannel通过Etcd服务维护了一张节点间的路由表。源主机A的flanneld服务将原始数据内容封装到UDP报文中,并根据自己的路由表通过物理网卡将数据投递给目标节点主机B的flanneld服务。一旦数据到达目标节点,它会被解包,并直接进入目标节点的flannel0接口。然后,数据将被转发到目标主机的docker0/cni0网桥,最终像本地容器通信一样,由docker0/cni0网桥转发到目标容器。

  • 整个过程中,Flannel通过UDP封装和解封装数据包,利用底层网络进行路由转发。每个节点上的flanneld服务根据自己维护的路由表,将数据包正确地转发到目标节点上的flanneld服务。这样,Flannel UDP模式实现了跨节点的容器通信。

  • 需要注意的是,Flannel UDP模式的工作原理是基于UDP封装和解封装数据包的,这可能会带来一定的性能开销。因此,在实际应用中,需要根据具体的需求和环境来选择合适的数据转发方式。

总结起来,Flannel UDP模式的工作原理是,通过在源节点上将数据封装到UDP报文中,并根据路由表将数据转发到目标节点上的flanneld服务。目标节点上的flanneld服务解包数据,并将其转发到目标容器。这样,Flannel UDP模式实现了跨节点的容器通信。

ETCD和Flannel之间的关系

ETCD是一个分布式键值存储系统,它被Flannel用于存储和管理可分配的IP地址段资源。Flannel使用ETCD来存储每个节点的网络配置信息,包括分配给每个节点的子网和可用的IP地址范围。这样,Flannel可以动态地管理IP地址资源,确保每个节点和Pod都有唯一的IP地址。

此外,Flannel还使用ETCD来监控每个Pod的实际地址,并在内存中建立和维护Pod节点之间的路由表。这样,Flannel可以根据路由表将数据包正确地转发到目标节点和目标Pod。

关于Flannel UDP模式的性能方面,由于UDP模式是在用户态进行转发,需要进行额外的报文隧道封装,因此性能上可能会比在内核态进行转发的VXLAN模式差一些。在UDP模式下,每个数据包都需要进行封装和解封装的过程,这可能会增加一定的延迟和带宽消耗。相比之下,VXLAN模式在内核态进行转发,可以更高效地处理数据包。

然而,性能差异可能因具体的环境和使用情况而异。在选择Flannel的数据转发模式时,需要综合考虑网络性能、可扩展性和安全性等因素,并根据实际需求进行评估和权衡。

总结起来,ETCD在Flannel中用于存储和管理IP地址段资源,并监控每个Pod的实际地址,建立和维护Pod节点之间的路由表。Flannel UDP模式在性能方面可能会比VXLAN模式差一些,因为它需要在用户态进行报文隧道封装。然而,性能差异可能因具体环境而异,需要根据实际需求进行评估和选择。

VXLAN 模式

由于 UDP 模式是在用户态做转发,会多一次报文隧道封装,因此性能上会比在内核态做转发的 VXLAN 模式差。

  • 在Flannel的VXLAN模式下,每个节点上会生成一个名为flannel.1的VXLAN网卡,也称为VTEP设备(VXLAN Tunnel Endpoint),它负责VXLAN封装和解封装。

  • VXLAN模式是在内核中进行的,Flannel本身不进行数据转发,而是动态设置ARP表和MAC表项。当数据包从源节点发送时,内核会将数据包封装在VXLAN头部中,并通过底层网络进行传输。当数据包到达目标节点时,内核会解封装数据包,并将其传递给目标容器。

  • 与UDP模式不同,VXLAN模式是在二层实现的,它使用数据帧作为Overlay网络的传输单位,因此属于MAC in UDP的模式。VXLAN封装和解封装是在内核中进行的,而不是在用户态进行的。

  • 需要注意的是,VXLAN模式相对于UDP模式来说更加简单,因为它不需要在用户态进行报文隧道封装和解封装。Flannel在VXLAN模式下主要负责动态设置ARP表和MAC表项,以确保数据包能够正确地转发到目标容器。

总结起来,VXLAN模式是Flannel中的一种网络模式,它使用VXLAN网卡(VTEP设备)在内核中进行VXLAN封装和解封装。Flannel本身不进行数据转发,而是动态设置ARP表和MAC表项。VXLAN模式是在二层实现的,使用数据帧作为Overlay网络的传输单位。相比之下,UDP模式是在三层进行转发,使用IP in UDP的模式。

Flannel VXLAN模式跨主机工作原理

  • 数据帧从主机A上的源容器中发出后,经由所在主机的docker0/cni0网络接口转发到flannel.1接口。

  • flannel.1接收到数据帧后,会在内核中添加VXLAN头部,并将数据帧封装在UDP报文中。

  • 主机A通过物理网卡将封装后的数据包发送到主机B的物理网卡中。

  • 主机B的物理网卡接收到数据包后,会根据VXLAN默认端口4789将数据包转发到flannel.1接口进行解封装。

  • 解封装后,内核将数据帧发送到cni0接口,最后由cni0接口将数据包发送到桥接到该接口的容器B中。

通过这个过程,Flannel VXLAN模式实现了跨主机的容器通信。数据包在源主机上经过封装后,通过底层物理网络传输到目标主机上,然后在目标主机上进行解封装,并最终传递给目标容器。

需要注意的是,Flannel VXLAN模式使用VXLAN头部进行封装和解封装,通过UDP报文在底层物理网络上传输数据。这种方式可以实现跨主机的容器通信,并且不需要对底层网络进行修改。

总结起来,Flannel VXLAN模式跨主机的工作原理是,数据帧从源容器经过封装后,通过底层物理网络传输到目标主机上,然后在目标主机上进行解封装,并最终传递给目标容器。这种方式实现了跨主机的容器通信,而不需要对底层网络进行修改。

网络插件 Calico

k8s 组网Calico方案与flannel方案区别

Flannel方案: Flannel使用隧道技术将发往容器的数据包进行封装,并通过隧道将封装后的数据包发送到运行目标Pod的节点上。目标节点负责解封装数据包,并将解封装后的数据包发送到目标Pod。这种方案对数据通信性能有一定的影响,因为数据包需要经过封装和解封装的过程。

Calico方案: Calico不使用隧道或NAT来实现转发,而是将主机视为Internet中的路由器。它使用BGP(Border Gateway Protocol)同步路由,并使用iptables来实现安全访问策略,实现跨主机的转发。Calico采用直接路由的方式,不需要修改报文数据,因此性能损耗较低。

在Calico方案中,每个节点都维护着自己的路由表,这样可以实现高效的数据转发。然而,在网络比较复杂的场景下,路由表可能会变得复杂,对运维人员提出了较高的要求,需要仔细管理和维护路由表。

总结起来,Flannel方案使用隧道技术进行数据封装和解封装,对数据通信性能有一定的影响。而Calico方案采用直接路由的方式,性能损耗较低,不需要修改报文数据。然而,Calico方案在网络复杂的场景下可能需要管理复杂的路由表。选择适合的组网方案需要综合考虑性能、复杂性和管理要求等因素。

Calico 主要组成部分

  • Calico CNI插件: Calico CNI插件是Calico与Kubernetes集成的组件,它负责与Kubernetes的kubelet进行对接,为容器提供网络功能。Calico CNI插件通过与Kubernetes API进行交互,获取容器的网络配置信息,并将其应用到宿主机上。

  • Felix: Felix是Calico的核心组件之一,它运行在每个宿主机上,负责维护宿主机上的路由规则、FIB转发信息库等。Felix与Linux内核进行交互,实现了路由、ACL(访问控制列表)和安全策略等功能。它监控网络状态的变化,并根据需要更新宿主机的网络配置。

  • BIRD: BIRD(BIRD Internet Routing Daemon)是Calico使用的路由器软件,负责分发路由规则,类似于一个路由器。BIRD收集和转发节点上的BGP(Border Gateway Protocol)路由信息,确保容器之间的网络通信能够正确进行。BIRD与Felix和etcd等组件进行交互,共同维护整个Calico网络的路由信息。

此外,Confd是Calico的配置管理组件,它用于管理和同步Calico的配置信息。Confd与etcd进行交互,监视和更新Calico的配置,确保各个组件之间的配置一致性。

总结起来,Calico主要由Calico CNI插件、Felix和BIRD组成。Calico CNI插件与Kubernetes集成,Felix负责维护宿主机上的路由规则和转发信息,BIRD负责分发路由规则,而Confd用于配置管理。这些组件共同工作,提供了高性能、高可靠性和灵活性的容器网络解决方案。

Calico 工作原理

  • Calico通过维护路由表来管理每个Pod之间的通信。Calico的CNI插件为每个容器设置了一个veth pair设备,其中一端连接到容器的网络命名空间,另一端连接到宿主机的网络命名空间。由于没有网桥,CNI插件还需要在宿主机上为每个容器的veth pair设备配置一条路由规则,用于接收传入的IP包。

  • 通过veth pair设备,容器发出的IP包会通过该设备到达宿主机,然后根据路由规则的下一跳地址,宿主机将IP包发送给正确的网关,然后到达目标宿主机,最终到达目标容器。

  • 这些路由规则由Calico的代理组件(Felix)维护和配置,而路由信息则是通过Calico的BIRD组件基于BGP协议进行分发。

  • Calico将集群中的每个节点视为边界路由器,它们一起组成了一个全互联的网络。节点之间通过BGP协议交换路由信息,这些节点被称为BGP Peer。这种设计使得Calico能够实现高度可扩展的容器网络,并具备复杂的网络配置和策略能力。

在选择CNI网络组件时,可以根据集群的规模和需求来选择。Flannel功能简单,适用于小规模集群,而Calico具备复杂的网络配置和策略能力,适用于需要更高级网络管理的大规模集群。

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值