下内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~
写在前边
从本文开始,笔者将分步讲解 Kubernetes 网络的相关知识,欢迎持续关注
在 Kubernetes 中,网络的实现原理非常复杂,且涉及众多概念,理解难度较大。
本文将对 Kubernetes 网络涉及的相关概念进行总体梳理,以作为后文展开的基础,便于大家学习理解。
概念总览
1、网络模型
2、网络数据包
网络数据包(Network Packet)作为网络通信中的数据传输单元,包含了数据发送方和数据接收方的地址信息(IP、端口、MAC 等),以及要传输的数据信息,是 TCP/IP 网络通信的基础。
在发送数据时,TCP/IP 堆栈的每一层都会添加自己的报文头,包含该层需要的控制/元数据,以便在数据包穿过网络时对其进行处理,并将生成的数据包传递到堆栈的下一层,最终产生一个完整的网络数据包。数据包在网络中传输,到达目的地后被重新组装成原始消息。
网络数据包的基本结构大致如下:
网络数据包的传输过程大致如下:
3、IP 路由
当网络设备接收到一个数据包时,将根据数据包的目的 IP 查询自身路由表。若存在匹配的路由条目则将数据包转发出去,若没有匹配的路由条目则将数据包丢弃,这个过程就是 IP 路由。
IP 路由涉及到的概念如下:
4、网络地址转换
网络地址转换(NAT,Network Address Translation)是在私有网络和公有网络之间,通过将数据包的 IP 地址、端口号进行转换,实现公有网络的地址复用,以允许多个私网设备共享同一个公网 IP 地址,同时保护私有网络的安全。
网络地址转换有以下两种形式:
5、网络命名空间
网络命名空间(Network Namespace)是 Linux 内核实现的一种网络隔离技术,允许系统管理员创建多个独立的网络环境,每个环境都有自己的网络设备、路由表、IP 地址、端口号、防火墙规则等,在一个命名空间中执行的操作不会影响其他命名空间。
网络命名空间是 Docker 容器实现网络隔离的关键组件,使得每个容器的网络栈与其他容器、以及宿主机的网络栈相互独立。
6、CIDR
CIDR(Classless Inter-Domain Routing)即无类域间路由,是一种用于分配 IP 地址、执行 IP 路由的方法,可以实现灵活的地址分配。使用 CIDR 时,IP 地址由两部分组成:
CIDR 使用弹性长度的子网掩码,可以更精确地定义网络地址,从而减少 IP 地址的浪费,并且提高路由表的聚合效率。
CIDR 使用最长前缀匹配的方式进行路由选择,当路由器收到一个数据包时,会与自身路由表中的每个路由条目进行前缀匹配,通过选择最长匹配的路由规则来确定下一跳的路径。
7、虚拟以太网设备对
虚拟以太网设备对(Virtual Ethernet Device Pairs)简称 veth-pair,工作在数据链路层,可以根据 MAC 地址对网络数据包进行转发。当 veth-pair 的一端接收到数据包时,veth-pair 会将数据包传递到 veth-pair 的另一端,实现数据包在两个连接的网络环境之间直接传输。
veth-pair 通常用于容器环境下两个 Network Namespace 之间的通信,veth-pair 设备一端位于容器中,命名为 eth0,另一端位于主机中,命名为 vethxxxx 形式。
8、网桥
网桥(Network Bridge)是 Linux 内核实现的一个工作在二层的虚拟网络设备,本质上是一个虚拟交换机,具备和物理交换机类似的功能。网桥可以绑定 Linux 网络设备作为从设备,并将其虚拟化为端口,相当于物理交换机的端口上插入了一根连有其他网络设备或终端的网线。
网桥的主要功能根据数据帧中的 MAC 地址,将数据帧从一个网络转发到另一个网络,使得两个独立的网络就好像是同一个网络。
9、CNI
CNI(Container Network Interface)即容器网络接口,是一个云原生计算基础项目,包括一个规范和用于编写插件来配置 Linux 容器网络接口的库。CNI 只关心容器的网络连通性,并在删除容器时删除已分配的资源。
10、VIP
VIP(Virtual IP Address)即虚拟 IP 地址,是一个软件定义的 IP 地址,不对应于实际的物理网络接口。
在 Kubernetes 中,每个 Service 对象在创建后都会分配一个 VIP,由 kube-proxy 组件通过 iptables 或 ipvs 实现,访问该 VIP 即可负载均衡到 Service 背后的 Endpoint(pod)上。
11、iptables
iptables 是一个允许 Linux 系统管理员配置 netfilter 及其存储的链和规则的程序。IP 表中的每个规则由许多分类器(iptables 匹配)和一个连接的操作(iptables 目标)组成。
12、ipvs
ipvs 是一个类似于 iptables 的工具。ipvs 基于 Linux 内核的 netfilter 钩子函数,但使用哈希表作为底层数据结构。与 iptables 相比,ipvs 重定向流量的速度要快得多,在同步代理规则时具有更好的性能,并提供更多的负载平衡算法。
13、netfilter
netfilter 是 Linux 中的数据包过滤框架,负责数据包过滤、网络地址转换(NAT)和其他数据包修饰。
14、DNS
DNS(Domain Name System)即域名系统,是一个将域名与 IP 地址关联起来的命名系统,用于将域名转换为 IP 地址,以便定位计算机服务。
15、底层网络
底层网络(Underlay Network)是指网络基础设施,如交换机,路由器,可以是二层或三层,二层的技术是 VLAN,三层的技术由 BGP、OSPF 等协议组成。
在 Kubernetes 中,Underlay Network 将节点作为路由设备,Pod 则通过学习路由条目来实现跨节点通信。
在 Kubernetes 中,Underlay Network 常见模式有:
16、覆盖网络
覆盖网络(Overlay Network)是指使用网络虚拟化技术,在 Underlay Network 上构建出虚拟逻辑网络。本质上来说,Overlay Network 使用一种或多种隧道协议,封装数据包后进行传输。
在 Kubernetes 中,Overlay Network 常见模式有:
17、隧道
隧道(Tunneling)是一种网络数据通信技术,主要解决网络协议不支持、数据传输不安全等网络通信问题,使隧道两端的网络组成一个更大的内部网络。
隧道协议分为二层隧道协议与三层隧道协议:
18、VXLAN
VXLAN 是目前最流行的 Overlay Network 隧道协议之一,将二层以太网帧封装在四层 UDP 报文中,通过三层网络传输,组成一个虚拟大二层网络。
VXLAN 使用 VTEP(VXLAN Tunnel Endpoint)来进行封包和解包,VTEP 可以是网络设备(如交换机),也可以是一台机器(如虚拟化集群中的宿主机)。
书籍推荐
最后推荐一本笔者从 Docker 进阶到 Kubernetes 自学过程中,受益较深的书籍。笔者经常复读,并结合工作实践不断加深理解和体会,可谓常读常新。希望这本书可以帮助到更多对 Kubernetes 感兴趣或刚开始学习的读者。