Kubernetes网络概念总览
Kubernetes网络概念总览
Kubernetes网络的实现原理非常复杂,涉及众多概念。本文将对Kubernetes网络涉及的相关概念进行总体梳理,以作为学习理解的基础。
网络模型
OSI七层模型:该模型将网络间信息传输的过程分为7层
物理层(Physical Layer)
数据链路层(Data Link Layer)
网络层(Network Layer)
传输层(Transport Layer)
会话层(Session Layer)
表示层(Presentation Layer)
应用层(Application Layer)
TCP/IP四层模型:该模型由OSI七层模型演化而来,实际上并不是单指TCP和IP协议,而是一个协议簇,包含了IP、TCP、UDP、FTP、SMTP等多种协议。
链路层(Link Layer)
IP层(IP Layer)
传输层(Transport Layer)
应用层(Application Layer)
网络数据包
网络数据包(Network Packet)作为网络通信中的数据传输单元,包含了数据发送方和数据接收方的地址信息(IP、端口、MAC等),以及要传输的数据信息,是TCP/IP网络通信的基础。
在发送数据时,TCP/IP堆栈的每一层都会添加自己的报文头,包含该层需要的控制/元数据,以便在数据包穿过网络时对其进行处理,并将生成的数据包传递到堆栈的下一层,最终产生一个完整的网络数据包。数据包在网络中传输,到达目的地后被重新组装成原始消息。
网络数据包的基本结构大致如下:
- 帧头(Frame Header):包含物理层和数据链路层的信息,如发送方和接收方的MAC地址
- 网络头(Network Header):包含网络层的信息,如IP地址
- 传输头(Transport Header):包含传输层的信息,如TCP或UDP端口号
- 数据(Payload):实际要传输的数据内容
- 帧尾(Frame Trailer):包含错误检测和校验信息,如CRC校验码
网络数据包的传输过程大致如下:
- 封装(Encapsulation):数据在发送时,从应用层开始向下经过每一层,每一层都会添加相应的头信息
- 传输(Transmission):数据包通过网络介质传输
- 解封装(Decapsulation):数据包到达目的地后,从物理层开始向上每一层去除头信息,直到应用层
- 错误检测(Error Detection):在传输过程中,数据包可能会因为各种因素而损坏,帧尾中的校验信息用于检测错误
IP路由
当网络设备接收到一个数据包时,将根据数据包的目的IP查询自身路由表。若存在匹配的路由条目则将数据包转发出去,若没有匹配的路由条目则将数据包丢弃,这个过程就是IP路由。
IP路由涉及到的概念如下:
- 路由表:是存储在路由器或网络设备中的一张表,它包含了到达不同网络目的地的路径信息。路由表中的每一项通常包含目的网络、子网掩码、下一跳地址、接口、路由协议、路由优先级等信息
- 路由协议:用于在网络设备(路由器)之间交换路由信息,以构建和维护路由表。常见的路由协议包括BGP(Border Gateway Protocol)、OSPF(Open Shortest Path First)、RIP(Routing Information Protocol)等
- 路由选择:是决定数据包从源到目的地的最佳路径的过程。这通常基于路由表中的信息,并可能考虑路径的成本、可靠性和负载等因素
- 静态路由:是手动配置的路由条目,不会随着网络变化而自动调整
- 动态路由:是路由器通过动态路由协议,从相邻网络设备自动学习和更新的路由条目
- 默认路由:一种特殊路由,当路由表中没有匹配的路由条目时,数据包会被发送到默认路由指定的下一跳
网络地址转换
网络地址转换(NAT,Network Address Translation)是在私有网络和公有网络之间,通过将数据包的IP地址、端口号进行转换,实现公有网络的地址复用,以允许多个私网设备共享同一个公网IP地址,同时保护私有网络的安全。
网络地址转换有以下两种形式:
- 源网络地址转换(SNAT,Source Network Address Translation):修改一个IP数据包源地址的NAT过程,用于为私有网络中的服务器等资源,提供访问公有网络的能力
- 目标网络地址转换(DNAT — Destination Network Address Translation):修改一个IP数据包目标地址的NAT过程,用于将私有网络中的服务发布到公有网络,供公有网络的用户访问
网络命名空间
网络命名空间(Network Namespace)是Linux内核实现的一种网络隔离技术,允许系统管理员创建多个独立的网络环境,每个环境都有自己的网络设备、路由表、IP地址、端口号、防火墙规则等,在一个命名空间中执行的操作不会影响其他命名空间。
网络命名空间是Docker容器实现网络隔离的关键组件,使得每个容器的网络栈与其他容器、以及宿主机的网络栈相互独立。
CIDR
CIDR(Classless Inter-Domain Routing)即无类域间路由,是一种用于分配IP地址、执行IP路由的方法,可以实现灵活的地址分配。使用CIDR时,IP地址由两部分组成:
- 网络前缀 :用于标识整个网络或子网
- 主机标识:用于标识该网络或子网上主机的特定接口
CIDR使用弹性长度的子网掩码,可以更精确地定义网络地址,从而减少IP地址的浪费,并且提高路由表的聚合效率。
CIDR使用最长前缀匹配的方式进行路由选择,当路由器收到一个数据包时,会与自身路由表中的每个路由条目进行前缀匹配,通过选择最长匹配的路由规则来确定下一跳的路径。
虚拟以太网设备对
虚拟以太网设备对(Virtual Ethernet Device Pairs)简称veth-pair,工作在数据链路层,可以根据MAC地址对网络数据包进行转发。当veth-pair的一端接收到数据包时,veth-pair会将数据包传递到veth-pair的另一端,实现数据包在两个连接的网络环境之间直接传输。
veth-pair通常用于容器环境下两个Network Namespace之间的通信,veth-pair设备一端位于容器中,命名为eth0,另一端位于主机中,命名为vethxxxx形式。
网桥
网桥(Network Bridge)是Linux内核实现的一个工作在二层的虚拟网络设备,本质上是一个虚拟交换机,具备和物理交换机类似的功能。网桥可以绑定Linux网络设备作为从设备,并将其虚拟化为端口,相当于物理交换机的端口上插入了一根连有其他网络设备或终端的网线。
网桥的主要功能根据数据帧中的MAC地址,将数据帧从一个网络转发到另一个网络,使得两个独立的网络就好像是同一个网络。
CNI
CNI(Container Network Interface)即容器网络接口,是一个云原生计算基础项目,包括一个规范和用于编写插件来配置Linux容器网络接口的库。CNI只关心容器的网络连通性,并在删除容器时删除已分配的资源。
VIP
VIP(Virtual IP Address)即虚拟IP地址,是一个软件定义的IP地址,不对应于实际的物理网络接口。
在Kubernetes中,每个Service对象在创建后都会分配一个VIP,由kube-proxy组件通过iptables或ipvs实现,访问该VIP即可负载均衡到Service背后的Endpoint(pod)上。
iptables
iptables是一个允许Linux系统管理员配置netfilter及其存储的链和规则的程序。IP表中的每个规则由许多分类器(iptables匹配)和一个连接的操作(iptables目标)组成。
ipvs
ipvs是一个类似于iptables的工具。ipvs基于Linux内核的netfilter钩子函数,但使用哈希表作为底层数据结构。与iptables相比,ipvs重定向流量的速度要快得多,在同步代理规则时具有更好的性能,并提供更多的负载平衡算法。
netfilter
netfilter是Linux中的数据包过滤框架,负责数据包过滤、网络地址转换(NAT)和其他数据包修饰。
DNS
DNS(Domain Name System)即域名系统,是一个将域名与IP地址关联起来的命名系统,用于将域名转换为IP地址,以便定位计算机服务。
底层网络
底层网络(Underlay Network)是指网络基础设施,如交换机,路由器,可以是二层或三层,二层的技术是VLAN,三层的技术由BGP、OSPF等协议组成。
在Kubernetes中,Underlay Network将节点作为路由设备,Pod则通过学习路由条目来实现跨节点通信。
在Kubernetes中,Underlay Network常见模式有:
- Flannel的HOST-GW模式
- Calico的BGP模式
覆盖网络
覆盖网络(Overlay Network)是指使用网络虚拟化技术,在Underlay Network上构建出虚拟逻辑网络。本质上来说,Overlay Network使用一种或多种隧道协议,封装数据包后进行传输。
在Kubernetes中,Overlay Network常见模式有:
- Flannel的VXLAN模式
- Calico的IPIP、VXLAN模式
- IPIP是在原始包的基础上封装成IPv4包
- VXLAN本质是一个UDP包
隧道
隧道(Tunneling)是一种网络数据通信技术,主要解决网络协议不支持、数据传输不安全等网络通信问题,使隧道两端的网络组成一个更大的内部网络。
隧道协议分为二层隧道协议与三层隧道协议:
- 二层隧道协议:对应OSI模型中的数据链路层,使用帧作为数据交换单位,将数据封装在点对点协议的帧中通过互联网络发送,协议包含PPTP、L2TP、L2F等
- 三层隧道协议:对应OSI模型中的网络层,将数据包封装在附加的IP包头中传输,协议包含GRE、IPSec、GRE等。Linux原生支持多种三层隧道,其底层实现原理都是基于tun设备
VXLAN
VXLAN是目前最流行的Overlay Network隧道协议之一,将二层以太网帧封装在四层UDP报文中,通过三层网络传输,组成一个虚拟大二层网络。
VXLAN使用VTEP(VXLAN Tunnel Endpoint)来进行封包和解包,VTEP可以是网络设备(如交换机),也可以是一台机器(如虚拟化集群中的宿主机)。