二、k8s 1.29 之 网络
1、基本概述
1.1
在谷歌GCE中有现成的网络模型,kubernetes中的pod可以在连通的扁平的网络中进行通信
但是在私有集群,阿里、华为、自建机房就没有了,需要我们自己实现网络模型,将不同节点 的docker打通
1.2 仨原则
在不使用网络地址转换(NAT)的情况下,集群中的Pod能够与任意其他Pod进行通信
在不使用网络地址转换(NAT)的情况下,在集群节点上运行的程序能与同一节点上的任何
Pod进行通信
每个Pod都有自己的IP地址(IP-per-Pod),并且任意其他Pod都可以通过相同的这个地
址访问它
2、CNI
CNI插件通常聚焦在容器到容器的网络通信。
借助CNI标准,Kubernetes可以实现容器网络问题的解决。通道过插件化的方式来集成各种网络插件,实现集群内部网络相互通信,只要实现CNI标准中定义的核心接作(ADD,将容器添加到网络;DEL,从网络中删除一个容器;CHECK,检查容器的网络是否符合预期等)。
CNI的接口并不是指HTTP,gRPC这种接口,CNI接口是指对可执行程序的调用(exec)可执行程序,Kubernetes节点默认的CNI插件路径为/opt/cni/bin
CNI通过JSON格式的配置文件来描述网络配置,当需要设置置容器网络时,由容器运行时负责执行CNI插件,并通过CNI插件的标准输入(stdin)来传递配置文件信息,通过标准输出(stdout)接收插件的执行结果。从网络插件功能可以分为五类:
Main插件,创建具体网络设备(bridge:网桥设备,连接 container和host;ipvlan:为容器
增加ipvlan网卡;loopback:lO设备;macvlan:为容器创建一个|MAC地址;ptp:创建一对
Veth Pair;vlan:分配一个vlan设备;host-device:将已存在的设备移入容器内)
PAM插件:负责分配IP地址(dhcp:容器向DHCP服务器发起请求,给Pod发放或回收IP地址
;host-local:使用预先配置的IP地址段来进行分配;staatic:为容器分配一个静态IPv4/IPv6地
址,主要用于debug)
META插件:其他功能的插件(tuning:通过sysctl调整网络设备参数;portmap:通过
iptables配置端口映射;bandwidth:使用Token Bucket Filter来限流;sbr:为网卡设置
source based routing;firewall:通过iptables给容器网络的进出流量进行限制
Windows插件:专门用于Windows平台的CNI插件(win-bridge与win-overlay网络插件)
第三方网络插件:第三方开源的网络插件众多,每个组件都有各自的优点及适应的场景,难以形成
统一的标准组件,常用有Flannel、Calico、Cilium、OVN网络插件
3、第三方网络插件
为了达到网络的扁平化(
网络的扁平化是指网络结构趋向于减少层级、简化中间环节,使信息传递和交互更直接、高效的现象
这种趋势的核心是提升效率、降低延迟,同时增强网络的灵活性和适应性,更好地应对海量数据传输和快速交互的需求。
)
以前主流:flannel
现在主流:calico
未来主流:cilium
网络模型:封装或未封装。
路由分发:一种外部网关协议,用于在互联网上交换路由和可达性信息。BGP可以帮助进行跨集群pod之间的网络。此功能对于未封装的CNI网络插件是必须的,并且通常由BGP完成。如果你想构建跨网段拆分的集群,路由分发是一个很好的功能。
网络策略:Kubernetes提供了强制执行规则的功能,这些规则决定了哪些service可以使用网络策略进行相互通信。这是从Kubernetes 1.7起稳定的功能,可以与某些网络插件一起使用用。
网格:允许在不同的Kubernetes集群间进行service之间的网络通信。
外部数据存储:具有此功能的CNI网络插件需要一个外部数据居存储来存储数据。
加密:允许加密和安全的网络控制和数据平面。
Ingress/Egress策略:允许你管理Kubernetes和非Kubernetes通信的路由控制。
4、calico
4.1 概述
Calico是一个纯三层的虚拟网络,它没有复用docker的dockeer0网桥,而是自己实现的,calico网络不对数据包进行额外封装,不需要NAT和端口映射,包含覆盖网络和非覆盖网络
4.2 架构
Felix
管理网络接口
编写路由
编写ACL
报告状态
bird (BGP Client)
BGP Client将通过BGP协议广播告诉剩余
calico 节点,从而实现网络互通
confd
通过监听etcd以了解BGP配置和全局默认
值的更改。Confd根据ETCD中数据的更新,
动态生成BIRD配置文件。当配置文件更改
时,confd触发BIRD重新加载新文件
4.3 基于三层的二层互联,在VXLAN中
先明确两个基础概念:
二层网络:类似 “小区内部的路”,设备靠 MAC 地址(比如 “门牌号”)通信,比如家里的 WiFi、公司的局域网,同一二层网络里的设备可以直接 “喊” 到对方。
三层网络:类似 “城市之间的高速路”,设备靠 IP 地址(比如 “城市地址”)通信,比如跨城市的互联网,负责远距离传输,但不认 MAC 地址。
问题:为什么需要 “基于三层的二层互联”?
假设你有两个办公室(A 办公室和 B 办公室):
每个办公室内部是二层网络(设备靠 MAC 地址通信,比如打印机、服务器)。
两个办公室之间隔了很远,靠三层网络(比如运营商的广域网、互联网)连接(类似 “两个小区被一条高速路隔开”)。
现在的需求是:让 A 办公室的电脑能像在同一个局域网里一样,直接访问 B 办公室的打印机(即保持 “二层通信” 的体验),但中间必须经过三层网络传输。
VXLAN 的作用:给二层数据 “打包”,让它能在三层网络上跑
VXLAN 就像一个 “快递服务”,解决了 “二层数据(小区内部的包裹)如何通过三层网络(高速路)送到另一个小区” 的问题,步骤如下:
A 办公室的设备要发数据给 B 办公室:
A 办公室的电脑生成一个 “二层数据包”(比如访问 B 办公室打印机的请求,带着目标 MAC 地址),但这个包本身只能在二层网络里跑,无法直接上三层网络(因为三层网络不认 MAC 地址)。VXLAN 给这个二层包 “打包”:
A 办公室的 VXLAN 设备(比如交换机)会把这个二层数据包,装进一个 “三层包裹” 里 —— 外面套上三层网络的 “地址标签”(即 VXLAN 隧道两端的 IP 地址,类似 “寄件城市” 和 “收件城市”)。通过三层网络传输:
这个 “三层包裹” 能在三层网络(高速路)上传输,因为三层网络只认 IP 地址,会根据外层的 IP 标签把包裹送到 B 办公室的 VXLAN 设备。B 办公室的 VXLAN 设备 “拆包”:
B 办公室的 VXLAN 设备收到包裹后,拆掉外层的三层标签,露出里面的二层数据包,再根据 MAC 地址(门牌号)送到目标设备(比如打印机)。
总结:“基于三层的二层互联” 的通俗理解
三层网络是 “运输通道”:负责远距离传输,就像高速路,只认 IP 地址。
二层互联是 “最终目的”:让两个被三层网络隔开的局域网,保持 “像在同一个局域网里通信” 的体验(比如直接用 MAC 地址访问)。
VXLAN 是 “打包工具”:把二层数据打包成三层网络能识别的格式,让它能在三层通道上传输,最终实现 “跨三层网络的二层通信”。
4.4 VXLAN工作模式
什么是VXLAN?
VXLAN,即Virtual Extensible LAN (虚拟可扩展局域网),是linux本身支持的一网种网络虚拟化
技术。VXLAN可以完全在内核态实现封装和解封装工作,从而通过"隧道"机制,构建出覆盖网络
(Overlay Network)
基于三层的"二层"通信,层即vxlan包封装在udp数据包中,要求udp在k8s节点间三层可达;
二层即vxlan封包的源mac地址和目的mac地址是自己的vxlan设备mac和对端vxlan设备mac
实现通讯。
优缺点
数据包封包:封包,在vxlan设备上将pod发来的数据包源、目的mac替换为本机vxlan网卡和对端节点vxlan网卡的mac。外层udp目的ip地址根据路由和对端vxlan的mac查fdb表获取
优势:只要k8s节点间三层互通,可以跨网段,对主机网关路由没有特殊要求。各个node节点通过vxlan设备实现基于三层的"二层"互通,三层即vxlan包封装在udp数据包中,要求udp在k8s节点间三层可达;二层即vxlan封包的源mac地址和目的mac地址是自己的vxlan设备mac和对端vxlan设备mac
缺点:需要进行vxlan的数据包封包和解包会存在一定的性能损损耗
配置方法
### 配置与验证总结
1. **配置方法**:
- 启用VXLAN,禁用IPIP;
- 设置`CALICO_IPV4POOL_IPIP`为`Never`,`CALICO_IPV4POOL_VXLAN`和`CALICO_IPV6POOL_VXLAN`为`Always`;
- 使用vxlan后端(非bird)。
2. **查看验证**:
- 存在`vxlan.calico`网络接口,状态为`UP`;
- `calicoctl node status`显示Calico进程运行,但BGP后端进程(BIRD/GOBGP)未运行(符合VXLAN无需BGP的特性);
- 接口收发数据包暂为0,存在8个发送丢弃包。
4.5 IPIP工作模式
概述
Linux原生内核支持
PIP隧道的工作原理是将源主机的IP数据包封装在一个新的IP数据包中,新的IP数据包的
目的地址是隧道的另一端。在隧道的另一端,接收方将解封装原原始IP数据包,并将其传递
到目标主机。IPIP隧道可以在不同的网络之间建立连接,例如在IPv4网络和IPv6网络之
间建立连接。
封装
优缺点
数据包封包:封包,在tunl0设备上将pod发来的数据包的mac层去掉,留下ip层封包。
外层数据包目的ip地址根据路由得到。
优点:只要k8s节点间三层互通,可以跨网段,对主机网关路由没有特殊要求。
缺点:需要进行IPIP的数据包封包和解包会存在一定的性能损耗
配置
### 配置与验证总结
1. **网络模式配置**
- 启用IPIP:`CALICO_IPV4POOL_IPIP="Always"`
- 禁用VXLAN:IPv4池(`CALICO_IPV4POOL_VXLAN="Never"`)、IPv6池(`CALICO_IPV6POOL_VXLAN="Never"`)
2. **状态验证**
- Calico进程运行正常(`calicoctl node status` 显示运行中)
- IPIP隧道接口`tunl0`存在(IP:10.244.32.128,MTU 1480)
- IPv4 BGP状态:2个节点(192.168.127.4、192.168.127.5)均为“Established”状态
- IPv6 BGP状态:无 peers 发现
3. **补充说明**:IPIP模式依赖BGP建立节点邻接关系,VXLAN无需BGP。
4.6 BGP工作模式 - 非封装 性能高
概述
- **定义**:BGP是互联网核心的去中心化自治路由协议,属矢量路由协议,用于维护IP路由表,实现自治系统(AS)间的可达性。
- **特点**:不采用内部网关协议(IGP)的传统指标,基于路径、网络策略或规则集决定路由。
- **通俗解释**:将机房多条线路(如电信、联通、移动)融合,实现多线单IP。
- **BGP机房优点**:服务器仅需一个IP,最佳访问路由由骨干路由器根据路由跳数等技术指标确定,不占用服务器系统资源。
优缺点
数据包封包:不需要进行数据包封包
优点:不用封包解包,通过BGP协议可实现pod网络在主机间的三层可达
缺点:跨网段时,配置较为复杂网络要求较高,主机网关路由也需要充当BGP Speaker。
配置
### 配置与验证总结
1. **配置方法**:
- 禁用IPv4的IPIP:`CALICO_IPV4POOL_IPIP: "Off"`
- 禁用IPv4的VXLAN:`CALICO_IPV4POOL_VXLAN: "Never"`
- 禁用IPv6的VXLAN:`CALICO_IPV6POOL_VXLAN: "Never"`
2. **查看验证结果**:
- **Calico进程状态**:运行正常(`calicoctl node status`)。
- **IPv4地址池(ippool)**:
- 默认池CIDR为`10.244.0.0/16`,IPIP和VXLAN模式均为`Never`,NAT禁用。
- BGP对等体状态:`192.168.127.4`和`192.168.127.5`均为`up`(节点间 mesh 模式)。
- **节点信息(node)**:
- 包含3个节点:`k8s-master01`(IP:192.168.127.3/24)、`k8s-node01`(IP:192.168.127.4/24)、`k8s-node02`(IP:192.168.127.5/24)。
- 所有节点ASN均为`64512`,无IPv6对等体。