首页 > 其他分享 >【Kubernets】容器网络基础二:通讲CNI(Container Network Interface)容器网络接口实现方案

【Kubernets】容器网络基础二:通讲CNI(Container Network Interface)容器网络接口实现方案

时间:2024-10-11 08:51:07浏览次数:8  
标签:容器 插件 Container Overlay 网络 Net 网络接口 Weave

文章目录

背景知识

Underlay网络

Underlay网络是指物理网络,或称为基础网络层、承载网络。它是由各类物理设备(如交换机、路由器、防火墙、负载均衡器等)通过物理链路连接而成的网络架构。这些物理设备通过路由协议确保设备之间的IP连通性,为数据包在主机之间的传输提供基本路径。

Underlay网络提供了主机之间的基本连接能力,包括IP网络、子网划分、路由协议等。它是直接在物理层上建立的网络,负责数据包在主机之间的传输,并提供基本的网络互联性。Underlay网络通常是静态配置的,由网络管理员管理和维护,主要关注网络的可用性、性能和扩展性。

在传统网络中,Underlay网络扮演着至关重要的角色,它确保了数据包能够在不同的物理设备之间顺畅传输。而在现代数据中心和云计算环境中,Underlay网络仍然是基础架构的重要组成部分,但它往往与Overlay网络(逻辑网络层)相结合,以提供更高级别的网络功能和服务。

Overlay网络是在Underlay网络之上构建的逻辑网络层,通过使用虚拟化技术创建的网络。它可以在不改变底层Underlay网络的前提下,添加额外的功能,如隧道、加密、负载均衡、虚拟网络等。Overlay网络和Underlay网络是一组相对概念,它们共同构成了现代网络架构的基础。

Overlay网络

Overlay网络模式是一种网络架构上叠加的虚拟化技术模式,它建立在已有的物理网络(Underlay网络)基础之上,通过在其上构建虚拟网络来实现网络资源的虚拟化。以下是关于Overlay网络模式的详细介绍:

一、基本概念
  1. 定义:Overlay网络是在现有物理网络之上,利用虚拟化技术构建的一个逻辑网络。这个逻辑网络具有独立的控制和转发平面,使得连接到Overlay网络的终端设备(如服务器、虚拟机等)能够在一个虚拟化的网络环境中进行通信。

  2. 特点

    • 独立性:Overlay网络独立于Underlay网络,对于连接到Overlay的终端设备来说,物理网络是透明的。
    • 虚拟化:通过虚拟化技术,Overlay网络能够在单个物理网络上实现多个逻辑网络的并存。
    • 灵活性:Overlay网络配置灵活,易于管理,可以根据业务需求进行动态调整。
二、工作原理

Overlay网络模式的工作原理通常涉及以下几个关键步骤

  1. 封装:在发送端,原始数据报文被封装在特定的协议头部中,以形成Overlay报文。这个协议头部包含了用于在Overlay网络中路由和转发报文所需的信息。
  2. 转发:封装后的Overlay报文被发送到Underlay网络中进行传输。Underlay网络负责提供必要的物理路径和带宽,以确保Overlay报文能够顺利到达目的地。
  3. 解封装:在接收端,Overlay报文被解封装,以恢复原始的数据报文。然后,这个数据报文被传递给目标终端设备进行处理。
三、实现方案

实现Overlay网络的方案有多种,每种方案都有其特定的优势和应用场景。以下是一些常见的Overlay网络实现方案:

  1. VXLAN(Virtual Extensible Local Area Network)

    • 描述:VXLAN是一种广泛使用的Overlay网络协议,它允许在现有的IP网络上创建一个虚拟化的Layer 2网络。
    • 优点:支持更多的网络隔离段(最多1600万个VNI),具有较好的扩展性和灵活性。
    • 应用场景:数据中心网络虚拟化,特别适用于大规模云计算环境。
  2. NVGRE(Network Virtualization using Generic Routing Encapsulation)

    • 描述:NVGRE是另一种Overlay网络协议,它类似于VXLAN但使用GRE(Generic Routing Encapsulation)作为封装协议。
    • 优点:与VXLAN相比,NVGRE更易于与现有的网络管理工具集成。
    • 应用场景:多租户数据中心和云服务提供商。
  3. STT(Stateless Transport Tunneling)

    • 描述:STT是为数据中心设计的Overlay网络协议,它利用TCP协议来传输封装的以太网帧,从而实现虚拟网络间的通信。
    • 优点:利用TCP的性能优化和拥塞控制机制,改善了跨数据中心通信的性能。
    • 应用场景:需要跨数据中心通信的大规模网络环境。
  4. Geneve

    • 描述:Geneve是一种尝试统一VXLAN、NVGRE等协议特性的Overlay网络封装格式,提供了一种灵活的框架来适应不同的网络虚拟化需求。
    • 优点:极高的灵活性和可扩展性,可以支持多种不同的网络虚拟化场景。
    • 应用场景:下一代数据中心网络,支持高度定制的网络虚拟化需求。
四、应用场景

Overlay网络模式在多个场景中得到了广泛应用,包括但不限于:

  1. 数据中心网络虚拟化:通过Overlay网络,数据中心可以实现网络资源的灵活配置和管理,提高网络资源的利用率和可扩展性。
  2. 多租户环境:在云计算和虚拟化环境中,Overlay网络可以为不同的租户提供独立的网络环境,增强网络隔离和安全性。
  3. 跨数据中心通信:Overlay网络可以实现跨数据中心的虚拟网络互联,简化网络架构,提高网络性能。

综上所述,Overlay网络模式是一种强大的虚拟化技术,它通过在现有物理网络上构建虚拟网络来实现网络资源的灵活配置和管理。随着云计算和虚拟化技术的不断发展,Overlay网络模式将在更多场景中得到广泛应用。

两者对比示意图

overlay-underlay

CNI实现有哪些?

CNI(Container Network Interface)的实现有多种,这些实现通常被称为CNI插件。以下是一些常见的CNI实现:

  1. Flannel

    • Flannel是一个简单易用的CNI插件,专为Kubernetes设计,用于提供覆盖网络(overlay network)。
    • Flannel使用VXLAN隧道技术封装数据包,在集群节点之间传输。
    • Flannel可以与etcd集成,用于存储网络配置状态信息
  2. Calico

    • Calico是一个高性能的CNI插件,支持复杂的网络策略、IP路由和防火墙功能。
    • Calico使用BGP协议进行路由,支持大规模网络部署。
    • Calico还提供了丰富的网络策略功能,可以细粒度地控制容器间的网络通信。
  3. Weave Net

    • Weave Net是另一个为Kubernetes设计的CNI插件,提供了快速、可靠的容器网络。
    • Weave Net使用加密的Weave Router和Weave Switch组件,确保容器间的通信安全。
    • Weave Net还支持跨主机容器通信和自动IP地址分配。
  4. MidoNet

    • MidoNet是一款网络虚拟化软件,可以作为CNI插件为Kubernetes提供网络支持。
    • MidoNet支持大规模SDN集群,具有分布式、多层次的特点。
    • MidoNet为每个租户分配一个逻辑路由器,租户之间相互隔离,但内部可以相互通信。
  5. Host-local

    • Host-local是一个简单的CNI插件,用于从本地IP地址池中为容器分配IP地址。
    • 它通常与其他CNI插件(如bridge)结合使用,以提供完整的网络配置。
  6. Bridge

    • Bridge插件在宿主机上创建网桥,并通过veth pair的方式将容器连接到该网桥上。
    • 它是Kubernetes中内置的CNI插件之一,适用于简单的网络部署。
  7. Macvlan/Ipvlan

    • Macvlan和Ipvlan插件允许容器直接使用宿主机的网络接口,通过虚拟MAC地址或IP地址实现网络通信。
    • 这些插件适用于需要高性能网络通信的场景,因为它们减少了网络虚拟化层的开销。
  8. 其他Meta插件

    • 除了上述插件外,还有一些Meta插件,如portmap、firewall、tuning等。
    • 这些插件通常用于提供额外的网络功能,如端口映射、防火墙规则、网络设备参数调整等。

这些CNI插件各有特点,适用于不同的应用场景。在选择CNI插件时,需要根据具体需求和网络环境进行评估和选择。同时,也可以根据需要组合使用多个CNI插件,以实现更复杂的网络配置和功能。

Flannel

Flannel 是一个简单的、可扩展的网络覆盖层工具,它为 Docker 容器提供了跨主机的网络连接。Flannel 主要用于 Kubernetes 集群中的网络配置,它通过创建一个虚拟的二层网络来连接各个节点上的容器,使得不同节点上的 Pod 可以像在同一个物理网络上一样直接通信。

Flannel 的工作原理

  1. 分配子网段

    • 当一个新的节点加入到集群时,Flannel 会从预先定义的 IP 地址池中分配一个子网段给该节点。这个子网段会被用来分配给该节点上的 Pod 使用。
  2. 建立网络覆盖

    • Flannel 使用各种不同的数据传输机制来建立覆盖网络,包括 UDP、VXLAN、Host-GW(主机网关)、IPsec 等。这些机制允许数据包从一个节点传输到另一个节点,即使它们之间存在物理网络隔离。
  3. 封装和解封数据包

    • 当一个 Pod 发送数据包到另一个节点上的 Pod 时,源节点的 Flannel 代理会先对数据包进行封装,然后通过选定的数据传输机制发送到目标节点。目标节点接收到封装后的数据包后,再由其上的 Flannel 代理解封并转发给目标 Pod。

Flannel 的主要组件

  • etcd:用于存储网络配置信息,如每个节点分配的子网段等。
  • flanneld:运行在每个节点上的代理服务,负责管理本地网络接口,并处理数据包的封装和解封。
  • CNI 插件:Container Network Interface(容器网络接口)插件,用于创建和管理 Pod 的网络接口。

数据传输机制

  • UDP:早期版本的 Flannel 使用 UDP 封装数据包,这种方式简单但效率较低,目前较少使用。
  • VXLAN:Virtual eXtensible Local Area Network,提供了一个更高效的数据传输方式,支持大规模部署。
  • Host-GW:利用主机的路由表来实现 Pod 之间的通信,不需要额外的数据封装,性能较好,但适用范围有限。
  • IPsec:通过加密隧道传输数据,适用于安全性要求较高的场景。

总结

Flannel 的设计目的是为了简化 Kubernetes 集群中的网络配置,它通过分配子网段、建立网络覆盖以及封装和解封数据包的方式,实现了不同节点上 Pod 之间的直接通信。选择合适的数据传输机制可以根据具体需求优化网络性能和安全性。

Calico

Calico是一种开源的网络和安全解决方案,其实现原理主要基于以下几个方面:

一、架构基础

Calico使用了一种称为“纯三层”架构的方法来提供高效的网络和安全服务。这种架构避免了二层网络中的数据包封装和解封装操作,从而提高了网络通信的效率。

二、核心组件与功能

  1. Felix

    • Felix是Calico的agent,运行在每台需要运行workload(如容器或虚拟机)的节点上。
    • 它主要负责配置路由及ACLs(访问控制列表)等信息,以确保endpoint(如容器)的连通状态。
  2. etcd

    • etcd是一个分布式键值存储,主要负责网络元数据的一致性。
    • 它确保Calico网络状态的准确性,是Calico网络中不可或缺的一部分。
  3. BGPClient(BIRD)

    • BGPClient(通常使用BIRD实现)主要负责把Felix写入kernel的路由信息分发到当前Calico网络。
    • 它确保workload间的通信的有效性,是Calico实现BGP路由协议的关键组件。
  4. BGP Route Reflector(BIRD)

    • 在大规模部署时,BGP Route Reflector用于摒弃所有节点互联的mesh模式。
    • 它通过一个或多个BGP Route Reflector来完成集中式的路由分发,降低了网络开销。

三、路由与数据包转发

  1. BGP路由协议

    • Calico使用BGP(Border Gateway Protocol)在集群内传播路由信息。
    • 每个运行了Calico组件的节点都被配置为BGP客户端,并与集群中的其他节点建立BGP对等关系。
    • 当新的Pod创建时,其IP地址会被添加到本地节点的路由表并通过BGP发布到整个集群。
    • 由此确保所有节点都能直接通过三层网络访问任何Pod,无需额外的隧道封装。
  2. 数据包转发

    • Calico在每个计算节点上利用Linux Kernel实现了一个高效的vRouter来负责数据转发。
    • 每个vRouter通过BGP协议负责把自己上运行的workload的路由信息像整个Calico网络内传播。
    • 当数据包到达宿主机时,根据路由表信息找到下一跳要到达的宿主机IP,并直接转发到对端容器的veth pair插在宿主机的一端,最终进入容器。

四、安全策略

Calico还使用了iptables规则来实现安全策略。每个容器都有自己的iptables规则,这些规则可以限制容器之间的网络访问,从而提高安全性。此外,Calico还支持网络流量的加密和身份验证,以保护敏感数据的安全。

五、数据路径模式

Calico支持多种数据路径模式,以适应不同的环境需求和性能要求。这些模式包括:

  1. 基于Linux内核功能的数据路径处理方式:如eBPF和XDP,它们提供了高性能的数据处理能力。
  2. 无隧道(纯L3)和有隧道(如VXLAN)的数据传输方式:无隧道模式直接利用IP路由进行数据包转发,而有隧道模式则使用隧道协议(如VXLAN)封装数据包进行传输。

六、集成与部署

作为Container Network Interface(CNI)插件,Calico可以无缝集成到Kubernetes集群中。它负责在Pod创建和销毁过程中自动配置网络接口、分配IP地址并设置相应的网络策略。此外,Calico还支持多种部署方式,包括在物理服务器、虚拟机(如OpenStack)或容器环境下部署。

综上所述,Calico通过结合BGP路由、iptables策略管理、CNI接口以及多种数据路径模式等关键技术,为Kubernetes等容器化平台提供了一个灵活、高效且安全的网络基础设施。

Weave Net

Weave Net的底层实现逻辑涉及多个组件和复杂的网络通信技术。以下是对Weave Net底层实现逻辑的详细说明:

一、Weave Net概述

Weave Net是一个流行的Overlay网络方案,它使用自家的Overlay技术来实现网络通信,并提供了网络策略和服务发现等功能。这些Overlay网络方案为Kubernetes集群提供了跨主机的容器通信能力,并确保容器之间的网络隔离和安全。

二、Weave Net的组件

Weave Net主要由以下几个组件构成:

  1. Weave Router(路由器)

    • 存在于不同的主机上,形成一系列的peers(对等体)。
    • 每个peer都有一个唯一的名字和标识符(UID),名字在重启后保持不变,便于用户理解和区分日志信息。
    • Weave路由器之间建立TCP连接,用于心跳握手和拓扑信息交换;同时建立UDP连接,用于网络包的封装和传输。
  2. Weave Agent

    • 每个节点上都有一个Weave Agent,负责与Weave Net进行交互。
    • Weave Agent与Weave Net守护进程通信,以建立和管理容器之间的网络连接。
  3. Weave Bridge(网桥)

    • 在主机上创建一个网桥,每个容器通过veth pair(虚拟以太网对)连接到网桥上。
    • 容器由用户或Weave网络的IPAM(IP地址管理)分配IP地址。

三、Weave Net的通信机制

  1. 封装与转发

    • Weave Net使用UDP封装二层以太网帧,并通过VTEP(VXLAN Tunnel End Point,即VXLAN隧道端点)设备实现原始以太报文的封装和解封装。
    • 数据包在发送时,首先被封装在UDP数据包中,然后发送到目标容器的VTEP。
    • 目标VTEP收到UDP数据包后,将其解封,并将数据包传递给目标容器。
  2. 路由决策

    • Weave网络路由器学习对端主机的特定MAC地址,并将这些信息和拓扑信息结合起来进行路由决策。
    • 路由器通过UDP转发数据包到目的主机上的Weave路由器,并注入到目的主机的内核空间,然后交给目的容器处理。
    • Weave还提供了两种路由模式:fast data path(完全工作在内核空间)和sleeve模式(通过用户空间进行路由决策)。
  3. 网络隔离与安全

    • Weave Net通过Overlay技术实现了网络隔离,使得不同租户或不同应用之间的流量被隔离。
    • Weave Net还提供了网络策略功能,允许用户定义精细的访问控制规则,以确保网络的安全性。

四、Weave Net的拓扑与扩展

  1. 扁平网络结构

    • Weave Net使用扁平的网络结构,所有容器都可以相互通信,而无需经过任何网关或路由器。
    • 这种设计简化了网络拓扑,提高了容器的可达性和可伸缩性。
  2. 自动发现与动态DNS

    • Weave Net支持自动发现和动态DNS功能,使得容器可以轻松地找到彼此并建立通信。
    • 这有助于在动态变化的云环境中实现高效的容器通信。
  3. 跨主机通信

    • Weave Net通过Overlay技术实现了跨主机的容器通信。
    • 容器可以通过Weave Net进行跨节点的通信,而无需担心底层网络的限制。

五、总结

Weave Net是一个功能强大且易于使用的容器网络插件。它通过Overlay技术实现了跨主机的容器通信,并提供了网络隔离、安全、自动发现和动态DNS等功能。Weave Net的底层实现逻辑涉及多个组件和复杂的网络通信技术,但通过这些组件和技术的协同工作,Weave Net能够为用户提供高效、可靠和安全的容器网络环境。

Bridge

容器网络中的Bridge模式,是Docker等容器技术中默认且广泛使用的网络类型。以下是对容器网络Bridge的详细解释:

一、概述

Bridge网络模式在宿主机上创建一个虚拟桥接器(通常命名为docker0),所有启动的容器都会连接到这个桥接器上,并被分配一个私有的IP地址。容器内部的网卡(通常是veth pair的一端)接入到docker0桥接器,而docker0桥接器则负责不同容器之间的数据包转发。

二、工作原理

  1. 虚拟网桥和虚拟网卡接口

    • 当Docker引擎创建一个Bridge网络时,它会在宿主机上创建一个新的虚拟网桥,例如docker0。
    • 接着,Docker引擎会将所有Docker容器的虚拟网卡接口连接到这个虚拟网桥上。
    • 每个容器的虚拟网卡接口都包含一个MAC地址和一个唯一的IP地址,这些信息用于标识和路由容器之间的数据包。
  2. 数据包转发

    • 当容器之间需要通信时,数据包会通过容器的虚拟网卡接口发送到docker0桥接器上。
    • docker0桥接器会检查数据包的目标IP地址,并根据路由表将数据包转发到正确的容器。
    • 如果数据包的目标IP地址与Bridge网络中的任何容器IP地址都不匹配,则docker0桥接器会将数据包转发到宿主机的默认路由。
  3. NAT技术

    • 为了实现容器访问外部网络,Bridge网络会自动为每个容器创建一个NAT(网络地址转换)规则。
    • 这些规则将容器内部的IP地址映射到宿主机的IP地址和端口上。
    • 当容器需要访问外部网络时,Docker引擎会将请求路由到宿主机上,并使用NAT规则将响应返回给容器。

三、特点与优势

  1. 简单易用
    • Bridge网络模式是Docker默认的网络类型,配置简单,适合单机多容器通信。
  2. 网络隔离性好
    • 通过Bridge网络,容器之间可以实现相互通信,同时与宿主机和其他外部网络保持隔离。
    • 这种隔离性提高了容器的安全性,防止了不同容器之间的网络干扰。
  3. 灵活性
    • 用户可以创建自定义的Bridge网络,并根据需要配置子网、网关等参数。
    • 这使得Bridge网络能够适应不同的应用场景和需求。

四、应用场景

  1. 单机多容器通信
    • 在单机环境下,多个容器需要相互通信时,可以使用Bridge网络模式。
    • 通过Bridge网络,容器可以方便地通过IP地址或容器名称进行通信。
  2. 与外部网络通信
    • 容器需要访问外部网络(如互联网)时,可以使用NAT技术将容器的流量伪装为宿主机的IP地址。
    • 这样,容器就可以通过宿主机的网络接口与外部网络进行通信。

五、注意事项

  1. 性能损耗
    • 在多层网络转发时,Bridge网络可能会带来一定的性能损耗。
    • 因此,在高性能要求的场景下,需要考虑其他网络模式(如Host网络模式)。
  2. 配置管理
    • 自定义Bridge网络需要用户自行配置和管理,包括子网、网关等参数的设置。
    • 用户需要具备一定的网络知识和管理经验来确保网络的正常运行。

综上所述,容器网络Bridge模式通过创建虚拟网桥和虚拟网卡接口,实现了容器之间的通信和与外部网络的访问。它具有简单易用、网络隔离性好和灵活性等优点,适用于单机多容器通信和外部网络通信等应用场景。然而,用户也需要注意性能损耗和配置管理等方面的问题。

容器网络示意

容器内部网络

network-inside

主机间网络

network-outside

相关文献

【计算机网络】网络相关技术介绍
【Kubernets】容器网络基础一:Veth Pair

标签:容器,插件,Container,Overlay,网络,Net,网络接口,Weave
From: https://blog.csdn.net/wendao76/article/details/142771201

相关文章

  • Boost C++ 库 | 智能指针(共享指针、共享数组、弱指针、介入式指针、指针容器)入门
    点击上方"蓝字"关注我们01、共享指针>>>这是使用率最高的智能指针,但是C++标准的第一版中缺少这种指针。它已经作为技术报告1(TR1)的一部分被添加到标准里了。如果开发环境支持的话,可以使用 memory 中定义的 std::shared_ptr。在BoostC++库里,这个智能指针命名为......
  • 进入容器:掌控Docker的世界
    进入容器:掌控Docker的世界在这个快速发展的技术时代,你是否曾被Docker的庞大生态所吸引?那么,有没有想过在这个容器化的世界里,如何快速高效地“进入”这些隐藏在虚拟墙后的容器呢?容器就如同魔法箱,装载着应用与服务,而你,通过探索这些容器,能够更好地管理、排除故障甚至优化性能。......
  • 2024.10.09 力扣刷题 盛水最多的容器
    题目:这边是参考了B站UP主的思路进行了解答,采用双下标访问的方式进行。如果要水最多的话,一定是高的那端找低的那端,然后算出面积。如果是低的那端找高的那端,那本身下限就在自己身上,所以不从低的端固定不变。附上代码:intmaxArea(std::vector<int>&height){ if(height.empty......
  • docker 容器安装配置 headscale
    docker-compose.ymlservices:headscale:image:headscale/headscale:v0.23.0container_name:headscalevolumes:-/etc/uhttpd.crt:/etc/uhttpd.crt-/etc/uhttpd.key:/etc/uhttpd.key-./etc/headscale/config:/etc/headscale......
  • C++模板与容器
    目录一、 模板1.函数模板2.类模板二、容器1.标准模板库STL2.概念3顺序容器3.1array数组2.3.2vector向量3.3list列表 3.4deque队列4关联容器5迭代器遍历一、 模板        模板可以让类或者函数支持一种通用类型,这种通用数据类型在实......
  • 在K8S中,初始化容器(initcontainer)作用是什么?
    在Kubernetes(K8s)中,初始化容器(InitContainer)是一种特殊的容器,它在Pod的主容器启动之前运行,并执行一系列初始化任务。以下是关于初始化容器作用的详细解释:1.定义与特性定义:初始化容器是定义在Pod规格中的一个或多个容器,它们在Pod中的任何应用程序容器(即普通的容器)启动之前执行。......
  • 哪个 Linux 命令向网络接口发送消息
    在Linux中,用于向网络接口发送消息或数据包的命令通常是ping、nc(Netcat)或nmap,具体取决于消息的上下文和用途。但是,如果您专门希望在较低级别发送数据包,则可以使用sendip或Scapy(一种Python工具)来制作和发送原始数据包。以下是一些可以帮助您管理和与网络接口交互的常......
  • LeetCode 11 Container with Most Water 解题思路和python代码
    题目:Youaregivenanintegerarrayheightoflengthn.Therearenverticallinesdrawnsuchthatthetwoendpointsoftheithlineare(i,0)and(i,height[i]).Findtwolinesthattogetherwiththex-axisformacontainer,suchthatthecontainerco......
  • 【STL详解】STL标准模板库入门 | STL版本 | STL六大组件 | STL优点 | 常用STL容器vect
    目录1、概述1.1、C++标准库1.2、Boost开源库2、STL版本2.1、HP原始版本2.2、P.J.实现版本2.3、RW实现版本2.4、SGI实现版本2.5、STLport实现版本3、STL的六大组件3.1、STL六大组件构成3.2、六大组件的交互关系4、STL优点5、STL常用容器vector、list......
  • 容器不是线程安全
    标准库中的std::queue不是线程安全的。这意味着在多线程环境中,多个线程同时对std::queue进行读写操作时,可能会导致数据竞争(datarace)和未定义行为。下面是详细的解释:原因数据竞争:当多个线程同时对std::queue进行操作(如push、pop等),如果没有使用适当的同步机制(如锁),就......