写点什么

Kubernetes 网络插件详解 - Calico 篇 - 网络基础

作者:巨子嘉
  • 2022 年 9 月 03 日
    广东
  • 本文字数:3615 字

    阅读完需:约 12 分钟

Kubernetes网络插件详解 - Calico篇 - 网络基础

Container 容器借助底层 Linux 操作系统的 Namespace 与 Cgroup 内核技术,实现在单一主机资源的轻量级虚拟化资源隔离,包含进程 ID、主机名、用户 ID、文件名、网络和进程间通信等。同时每个网络空间 Network Namesapce 都有独立的网络栈,包括网络接口(Network Interface)、回环设备(Lookback Device)、路由表(Routing Table)和 iptables 规则等,是容器网络隔离与通信的基础。

Kubernetes 是以 Container 容器技术为核心的调度引擎,将传统云计算对应的基础资源,包含计算、存储,网络进行了彻底池化统一管理,同时将运行在技术架构之上的应用和服务也进行了抽象标准化,再通过调度快速实现应用与资源的匹配,即以应用为中心构建云原生操作系统能力。

在 Kubernetes 集群内,既要解决相同宿主机多个命名空间网络栈共享底层硬件资源,同时还要解决集群内部跨宿主机网络通信的问题,面向应用提供完成的网络能力,所以容器网络是 Kubernetes 最复杂部分,同时也是设计精华所在:对于相同宿主机共享底层硬件设备问题,通常是借助虚拟化技术来实现,通过虚拟设备来实现灵活的管理,再将虚拟化设备连接到真实的物理设备上实现网络通信;对于跨宿主机网络通信问题,采用 SDN 软件定义网络的思路,灵活使用底层网络通信协议,同时结合各种虚拟化隧道通信技术,实现容器集群内外部通信。

所以要搞清楚复杂的容器网络及各种各样的网络插件,首先需要了解网络通信基础,网络设备虚拟化以及网络隧道技术。

网络通信基础

网络模型:OSI 网络模型将网络数据发送和接收数据的过程分为 7 层,分别是物理层(Physical Layer),数据链路层(Data Link Layer),网络层(Network Layer),传输层(Transport Layer),会话层(Session Layer),表示层(Presentation Layer),应用层(Application Layer)。TCP/IP 协议定义了一个应用于不同网络间信息传输的协议簇,对网络中各层次的通信制定了标准和方法。TCP/IP 包含了很多协议,常见的协议包括 IP、FTP、TCP、UDP、SMTP 等。TCP/IP 协议定义 4 层或者 5 层,4 层主要包含链路层,网络层,传输层,应用层。OSI 是开放系统的互连模型,相关的协议已经非常少使用,但是模型本身非常通用;只是由于 OSI 模型过于理想化,至今尚未有完整的实现。TCP/IP 网络结构体系实际上是由 OSI 七层模型演化而来,是一个工业标准,并不是只由 TCP 和 IP 协议组成,而是由支持能够在多个不同的网络间实现信息传输的协议簇,后续的网络通信主要是基于 TCP/IP 协议讲解。

网络数据包:在 TCP/IP 通信中,网络层的作用是实现终端的点对点通信。通过 IP 地址将数据包发送给目的主机,在发送数据时,网络堆栈的每一层都会添加自己的报文头,包含该层需要的控制/元数据,以便在数据包穿过网络时对其进行处理,并将生成的数据包传递到堆栈的下一层。 这样就产生了完整的数据包。

IP 路由:当网络设备收到一个数据包时,它根据数据包的目的 IP 地址查询路由表,如果有匹配的路由条目,就根据查询结果将数据包转发出去,如果没有任何匹配的路由条目,则将数据包丢弃,这个过程就是 IP 路由。除了路由器,三层交换机、防火墙、负载均衡设备甚至主机等设备都可以进行路由操作。每一个路由条目包含目的网段地址/子网掩码、路由协议、出接口、下一跳 IP 地址、路由优先级和度量值等信息。路由表直连路由、静态路由和动态路由三种方式获取,其中动态路由是通过动态路由协议从相邻网络设备动态学习到的路由条目。协议有 OSPF,BGP ,RIP,RIPv2 等。

其中 BGP 协议,即边界网关协议,是一种运行于 TCP 上的一种能够处理因特网大小的网络协议,也是一种可以完善无关路由域间的多路连接协议。BGP 主要用于与其他 BGP 线路建立网络连接、相互交换包括 AS 在内的信息。Kubernetes 容器网络插件 Calico,就基于此协议实现网络数据转发。

NAT(Network Address Translation):网络地址转换是一种地址转换技术,可以将 IP 数据报文头中的 IP 地址转换为另一个 IP 地址,并通过转换端口号达到地址重用的目的。

网络设备虚拟化

在没有虚拟化技术之前,计算机网络系统都只通过物理网卡,线缆介质,连接外部网络,构成庞大的网络。随着虚拟化技术的出现,网络也随之被虚拟化,相较于单一的物理网络,虚拟网络变得非常复杂。Linux 虚拟网络的底层都是由一个个的虚拟设备构成的,以此来实现诸如交换、路由、隧道、隔离、聚合等多种网络功能。常见的虚拟网络设备有 tap/tun、veth-pair 和 bridge

Tap/Tun:是 Linux 内核实现的一对虚拟网络设备,TAP 工作在二层,TUN 工作在三层。Linux 内核通过 TAP/TUN 设备向绑定该设备的用户空间程序发送数据,反之用户空间程序也可以像操作物理网络设备那样向 TAP/TUN 设备发送数据。

Veth-pair:一端连着内核协议栈,另一端连着另一个设备,一个设备收到内核发送的数据后,会发送到另一个设备上去,这种设备通常用于容器中两个 namespace 之间的通信。

Bridge:是 Linux 内核实现的一个工作在二层的虚拟网络设备,但不同于 TAP/TUN 这种单端口的设备,Bridge 实现为多端口,本质上是一个虚拟交换机,具备和物理交换机类似的功能。Bridge 可以绑定其他 Linux 网络设备作为从设备,并将这些从设备虚拟化为端口,当一个从设备被绑定到 Bridge 上时,就相当于真实网络中的交换机端口上插入了一根连有终端的网线。

网络隧道技术

隧道(Tunneling)是一种网络数据通信技术,主要解决网络协议不支持,数据传输不安全等网络通信问题。将不支持的协议数据包打包成支持的协议数据包之后进行传输,或在不安全网络上提供一个安全路径。通过网络隧道技术,可以使隧道两端的网络组成一个更大的内部网络。

隧道协议有二层隧道协议与三层隧道协议两类,二层隧道协议对应 OSI 模型中数据链路层,使用帧作为数据交换单位,将数据封装在点对点协议的帧中通过互联网络发送,协议包含 PPTP、L2TP、L2F 等。三层隧道协议对应 OSI 模型中网络层,使用包作为数据交换单位,将数据包封装在附加的 IP 包头中通过 IP 网络传送,协议包含 GRE、IPSec、GRE 等。Linux 原生支持多种三层隧道,其底层实现原理都是基于 tun 设备:  

  • IPIP:普通的 IPIP 隧道,就是在报文的基础上再封装成一个 IPv4 报文

  • GRE:通用路由封装(Generic Routing Encapsulation),定义了在任意网络层协议上封装其他网络层协议的机制,所以对于 IPv4 和 IPv6 都适用

  • SIT:主要用于 IPv4 报文封装 IPv6 报文,即 IPv6 over IPv4

  • ISATAP:站内自动隧道寻址协议,类似于 sit 也是用于 IPv6 的隧道封装

  • VTI:即虚拟隧道接口(Virtual Tunnel Interface),是一种 IPsec 隧道技术.

Linux 内核自 3.7 版本开始支持 VXLAN 隧道技术,是目前最流行的 Overlay 网络隧道协议之一,将二层以太网帧封装在四层 UDP 报文中,通过三层网络传输,组成一个虚拟大二层网络。VXLAN 使用 VTEP(VXLAN Tunnel Endpoint)来进行封包和解包:在发送端,源 VTEP 将原始报文封装成 VXLAN 报文,通过 UDP 发送到对端 VTEP;在接收端,VTEP 将解开 VXLAN 报文,将原始的二层数据帧转发给目的的接收方。VTEP 可以是独立的网络设备,例如交换机,也可以是部署在服务器上的虚拟设备。例如使用置顶交换机(TOR)作为 VTEP 时,VXLAN 的网络模型如下图:

  • VTEP(VXLAN tunnel endpoints):VXLAN 网络的边缘设备,用来进行 VXLAN 报文的封包与解包。VTEP 可以是网络设备(例如交换机),也可以是一台机器(例如虚拟化集群中的宿主机)。

  • VNI(VXLAN network identifier):VNI 是 VXLAN 的标识,是个 24 位整数,因此最大值是2的24次方个。如果一个 VNI 对应一个租户,那么理论上 VXLAN 可以支持千万级别的租户。

  • VXLAN tunnel:隧道是一个逻辑上的概念,在 VXLAN 模型中并没有具体的物理实体相对应。隧道可以看作一个虚拟通道,VXLAN 通信双方都认为自己在直接通信,并不知道底层网络的存在。从整体上看,每个 VXLAN 网络像是为通信的设备搭建了一个单独的通信通道,也就是隧道。

VXLAN 的报文就是 MAC in UDP,即在三层网络的基础上构建一个虚拟的二层网络。VXLAN 的封包格式显示原来的二层以太网帧(包含 MAC 头部、IP 头部和传输层头部的报文),被放在 VXLAN 包头里进行封装,再套到标准的 UDP 头部(UDP 头部、IP 头部和 MAC 头部),用来在底层网络上传输报文。VXLAN 报文比原始报文多出 50 个字节,这降低了网络链路传输的有效数据比例,尤其是小包。UDP 目的端口是接收方 VTEP 设备使用的端口,IANA 分配了 4789 作为 VXLAN 的目的 UDP 端口(flannel VXLAN 模式是 8472)。

总结

总的来说,云原生 Kubernetes 并且没有创造新的网络技术,而是根据各种场景灵活的聚合使用各种网络技术。从底层通信技术来看,容器网络有 Overlay 模式,路由模式,以及 Underlay 模式三种,其中 Overlay 模式主要是通过虚拟化与隧道技术,屏蔽底层网络复杂路由转发,面向应用提供简单高效的通信能力。同时底层操作系统内核的网络的技术也在发展演进,各种虚拟化技术及隧道技术极其相似,又各自有细微的差别,所以才有多种容器网络插件及网络模式,所以容器网络规划选择一定要针对业务应用的场景,在灵活,高效,以及成本等多因素中权衡选择合适的网络方案。

关注“巨子嘉”,巨子出品,必属精品

发布于: 刚刚阅读数: 6
用户头像

巨子嘉

关注

云原生,DevOps 2019.09.20 加入

还未添加个人简介

评论

发布
暂无评论
Kubernetes网络插件详解 - Calico篇 - 网络基础_巨子嘉_InfoQ写作社区