【K8s】Kubernetes 网络之概念总览
文摘
科技
2024-11-04 07:00
北京
下内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~
从本文开始,笔者将分步讲解 Kubernetes 网络的相关知识,欢迎持续关注
在 Kubernetes 中,网络的实现原理非常复杂,且涉及众多概念,理解难度较大。
本文将对 Kubernetes 网络涉及的相关概念进行总体梳理,以作为后文展开的基础,便于大家学习理解。
网络数据包(Network Packet)作为网络通信中的数据传输单元,包含了数据发送方和数据接收方的地址信息(IP、端口、MAC 等),以及要传输的数据信息,是 TCP/IP 网络通信的基础。在发送数据时,TCP/IP 堆栈的每一层都会添加自己的报文头,包含该层需要的控制/元数据,以便在数据包穿过网络时对其进行处理,并将生成的数据包传递到堆栈的下一层,最终产生一个完整的网络数据包。数据包在网络中传输,到达目的地后被重新组装成原始消息。- 帧头(Frame Header):包含物理层和数据链路层的信息,如发送方和接收方的 MAC 地址
- 网络头(Network Header):包含网络层的信息,如 IP 地址
- 传输头(Transport Header):包含传输层的信息,如 TCP 或 UDP 端口号
- 帧尾(Frame Trailer):包含错误检测和校验信息,如 CRC 校验码
- 封装(Encapsulation):数据在发送时,从应用层开始向下经过每一层,每一层都会添加相应的头信息
- 传输(Transmission):数据包通过网络介质传输
- 解封装(Decapsulation):数据包到达目的地后,从物理层开始向上每一层去除头信息,直到应用层
- 错误检测(Error Detection):在传输过程中,数据包可能会因为各种因素而损坏,帧尾中的校验信息用于检测错误
当网络设备接收到一个数据包时,将根据数据包的目的 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(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(Container Network Interface)即容器网络接口,是一个云原生计算基础项目,包括一个规范和用于编写插件来配置 Linux 容器网络接口的库。CNI 只关心容器的网络连通性,并在删除容器时删除已分配的资源。VIP(Virtual IP Address)即虚拟 IP 地址,是一个软件定义的 IP 地址,不对应于实际的物理网络接口。在 Kubernetes 中,每个 Service 对象在创建后都会分配一个 VIP,由 kube-proxy 组件通过 iptables 或 ipvs 实现,访问该 VIP 即可负载均衡到 Service 背后的 Endpoint(pod)上。iptables 是一个允许 Linux 系统管理员配置 netfilter 及其存储的链和规则的程序。IP 表中的每个规则由许多分类器(iptables 匹配)和一个连接的操作(iptables 目标)组成。ipvs 是一个类似于 iptables 的工具。ipvs 基于 Linux 内核的 netfilter 钩子函数,但使用哈希表作为底层数据结构。与 iptables 相比,ipvs 重定向流量的速度要快得多,在同步代理规则时具有更好的性能,并提供更多的负载平衡算法。netfilter 是 Linux 中的数据包过滤框架,负责数据包过滤、网络地址转换(NAT)和其他数据包修饰。DNS(Domain Name System)即域名系统,是一个将域名与 IP 地址关联起来的命名系统,用于将域名转换为 IP 地址,以便定位计算机服务。底层网络(Underlay Network)是指网络基础设施,如交换机,路由器,可以是二层或三层,二层的技术是 VLAN,三层的技术由 BGP、OSPF 等协议组成。在 Kubernetes 中,Underlay Network 将节点作为路由设备,Pod 则通过学习路由条目来实现跨节点通信。在 Kubernetes 中,Underlay Network 常见模式有:覆盖网络(Overlay Network)是指使用网络虚拟化技术,在 Underlay Network 上构建出虚拟逻辑网络。本质上来说,Overlay Network 使用一种或多种隧道协议,封装数据包后进行传输。在 Kubernetes 中,Overlay Network 常见模式有:隧道(Tunneling)是一种网络数据通信技术,主要解决网络协议不支持、数据传输不安全等网络通信问题,使隧道两端的网络组成一个更大的内部网络。- 二层隧道协议:对应 OSI 模型中的数据链路层,使用帧作为数据交换单位,将数据封装在点对点协议的帧中通过互联网络发送,协议包含 PPTP、L2TP、L2F 等
- 三层隧道协议:对应 OSI 模型中的网络层,将数据包封装在附加的 IP 包头中传输,协议包含 GRE、IPSec、GRE 等。Linux 原生支持多种三层隧道,其底层实现原理都是基于 tun 设备
VXLAN 是目前最流行的 Overlay Network 隧道协议之一,将二层以太网帧封装在四层 UDP 报文中,通过三层网络传输,组成一个虚拟大二层网络。VXLAN 使用 VTEP(VXLAN Tunnel Endpoint)来进行封包和解包,VTEP 可以是网络设备(如交换机),也可以是一台机器(如虚拟化集群中的宿主机)。
书籍推荐
最后推荐一本笔者从 Docker 进阶到 Kubernetes 自学过程中,受益较深的书籍。笔者经常复读,并结合工作实践不断加深理解和体会,可谓常读常新。希望这本书可以帮助到更多对 Kubernetes 感兴趣或刚开始学习的读者。