浅谈网络 | 容器网络之Flannel

news/2025/2/1 4:17:03 标签: 网络

目录

    • 云原生网络架构深度解构:Flannel的设计哲学与实现机制
    • Flannel架构解析:三层核心设计原则
      • UDP模式(用户态隧道)
      • VXLAN模式(内核态隧道)
      • Host-GW模式(直连路由)
    • 生产环境架构选型与调优实践
      • 性能维度对比
      • 关键调优参数
    • 超越Flannel:云原生网络演进趋势

云原生网络架构深度解构:Flannel的设计哲学与实现机制

——从Overlay隧道到分布式网络平面的工程实践

云原生网络的核心挑战与范式升级
在传统单体架构向微服务演进的过程中,网络通信模型经历了从"静态配置"到"动态感知"的范式转变。当Kubernetes将容器调度至任意节点时,IP漂移与跨节点通信成为两大核心挑战:

身份漂移困境
如示例中所示,当应用B从物理机A(IP1)迁移至物理机B(IP5)时,传统硬编码IP的调用方式将彻底失效。Kubernetes通过Endpoint与Service抽象层实现服务发现,但其底层依赖容器网络平面实现真实流量的跨节点路由。
在这里插入图片描述

网络隔离悖论
Docker默认的172.17.0.0/16桥接网络在跨主机场景下会导致IP冲突(如物理机A与B的容器均使用172.17.0.2)。Flannel通过集群级子网分配机制,为每个节点划分独立子网(如物理机A:172.17.8.0/24,物理机B:172.17.9.0/24),构建全局唯一的容器IP空间。

Flannel架构解析:三层核心设计原则

Flannel的本质是通过软件定义网络(SDN)构建分布式Overlay,其架构遵循三大设计原则:

  1. 子网动态分配与全局路由同步
    Etcd协同:Flannel通过Etcd集群维护全局子网分配状态,每个节点的flanneld进程启动时从Etcd申请唯一子网段(如/24)。

CNI插件集成:Flannel为各节点配置CNI插件,将子网信息注入容器运行时(如Docker的bip参数),确保容器IP在集群维度唯一。

  1. 数据面隧道封装机制
    Flannel支持多种后端实现,核心差异在于封装协议与性能特征:

UDP模式(用户态隧道)

工作流程:容器A(172.17.8.2)→ docker0 → flannel.1(TUN设备)→ flanneld(UDP封装)→ 物理机B → flanneld(解封装)→ docker0 → 容器B(172.17.9.2)
在这里插入图片描述

性能瓶颈:数据包需多次用户态-内核态切换,吞吐量受限(实测通常<1Gbps)。
第一次:用户态的容器进程发出的 IP 包经过 docker0 网桥进入内核态;
第二次:IP 包根据路由表进入 TUN(flannel0)设备,从而回到用户态的 flanneld 进程;
第三次:flanneld 进行 UDP 封包之后重新进入内核态,将 UDP 包通过宿主机的 eth0 发出去。
Flannel 进行 UDP 封装(Encapsulation)和解封装(Decapsulation)的过程,也都是在用户态完成的。在 Linux 操作系统中,上述这些上下文切换和用户态操作的代价其实是比较高的,这也正是造成 Flannel UDP 模式性能不好的主要原因。
在这里插入图片描述

Flannel UDP 模式提供的其实是一个三层的 Overlay 网络,即:它首先对发出端的 IP 包进行 UDP 封装,然后在接收端进行解封装拿到原始的 IP 包,进而把这个 IP 包转发给目标容器。这就好比,Flannel 在不同宿主机上的两个容器之间打通了一条“隧道”,使得这两个容器可以直接使用 IP 地址进行通信,而无需关心容器和宿主机的分布情况。

UDP 模式有严重的性能问题,所以已经被废弃了

VXLAN模式(内核态隧道)

此种模式和 UDP 比较相像,只不过它的封包和解包都在内核,因为 VXLAN 本身就是内核的一个模块。

VTEP自动化:通过netlink创建flannel.1虚拟网卡作为VXLAN隧道端点(VTEP),MAC学习由内核完成。

封装优化:外层IP头携带宿主机地址,内层VXLAN头携带容器MAC,利用硬件Offload提升性能(可达10Gbps)。

路由策略:通过bridge fdb命令动态维护VTEP MAC与宿主机IP的映射关系。
在这里插入图片描述

Host-GW模式(直连路由)

无封装开销:通过宿主机的路由表直接转发(如ip route add 172.17.9.0/24 via 192.168.100.101)。

网络要求:集群节点需二层互通,适用于私有云裸金属环境。

  1. 地址转换与策略联动
    SNAT/DNAT控制:通过iptables规则实现容器出向流量的源地址转换(SNAT),以及入向流量的目的地址转换(DNAT)。

NetworkPolicy扩展:与Calico等插件协同,实现基于标签的微隔离策略,弥补Flannel原生策略能力的不足。

host-gw 模式的工作原理,其实就是将每个 Flannel 子网(Flannel Subnet,比如:10.244.1.0/24)的“下一跳”,设置成了该子网对应的宿主机的 IP 地址。如图:
在这里插入图片描述

host-gw 模式能够正常工作的核心,就在于 IP 包在封装成帧发送出去的时候,会使用路由表里的“下一跳”来设置目的 MAC 地址。这样,它就会经过二层网络到达目的宿主机。所有必须要求集群宿主机之间是二层连通的。

生产环境架构选型与调优实践

性能维度对比

后端模式延迟吞吐量CPU开销适用场景
UDPPOC测试、边缘环境
VXLAN公有云、混合云
Host-GW极高私有云裸金属集群

关键调优参数

  • MTU优化
    VXLAN封装导致有效MTU减少50字节,需调整容器MTU为1450以避免分片。

  • ARP缓存
    增大 net.ipv4.neigh.default.gc_thresh 值,防止大规模集群中ARP表项溢出。

  • 并发连接
    对于UDP模式,调整flanneld--iface参数绑定高速网卡,并启用多队列优化。
    关键调优参数
    MTU优化:VXLAN封装导致有效MTU减少50字节,需调整容器MTU为1450以避免分片。

超越Flannel:云原生网络演进趋势

尽管Flannel以其简洁性成为入门首选,但在超大规模集群中面临Etcd性能瓶颈与策略能力短板。下一代CNI插件呈现三大趋势:

eBPF数据面:Cilium等方案通过eBPF实现内核级策略执行与负载均衡,延迟降低40%以上。

多租户隔离:通过NetworkAttachmentDefinition实现多网络平面隔离,满足金融级合规需求。

服务网格融合:Istio与CNI插件深度集成,实现L7流量治理与零信任安全。


http://www.niftyadmin.cn/n/5839007.html

相关文章

开启eslint后,html中全角符号绕过eslint检测

直接在需要的地方复制这块eslint代码就行 <!-- eslint-disable-next-line no-irregular-whitespace -->

395. 至少有K个重复字符的最长子串

参考题解&#xff1a;https://leetcode.cn/problems/longest-substring-with-at-least-k-repeating-characters/solutions/623991/jie-ben-ti-bang-zhu-da-jia-li-jie-di-gui-obla 递归含义&#xff1a;返回字符串s中至少有k个重复字符的最长子串递归终止条件&#xff1a;当s的…

Spring04 - filter和interceptor

filter和interceptor 文章目录 filter和interceptor一&#xff1a;舶来品和原住民1&#xff1a;Filter&#xff1a;1.1&#xff1a;基本概念1.2&#xff1a;Spring Boot中的使用 2&#xff1a;Interceptor&#xff1a;2.1&#xff1a;基本概念2.2&#xff1a;Spring Boot中的使…

AI 模型优化与性能调优

在 AI 应用中&#xff0c;模型的性能是一个非常重要的考量因素。为了确保高效的响应时间和资源利用率&#xff0c;我们需要对 AI 模型进行性能优化和调优。本篇博客将介绍如何对 AI 模型进行性能调优&#xff0c;包括&#xff1a; 模型大小优化推理速度提升内存管理并发与负载…

Autogen_core: Model Context

目录 示例代码代码解释另一个例子 示例代码 from dataclasses import dataclassfrom autogen_core import AgentId, MessageContext, RoutedAgent, SingleThreadedAgentRuntime, message_handler from autogen_core.model_context import BufferedChatCompletionContext from …

JavaScript - Web APIs(下)

日期对象 目标&#xff1a;掌握日期对象&#xff0c;可以让网页显示日期 日期对象&#xff1a;用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 学习路径&#xff1a; 实例化 日期对象方法 时间戳 实例化 目标&#xff1a;能够实例化日期对象 在代码中发…

[Java]泛型(一)泛型类

1. 什么是泛型类&#xff1f; 泛型类是指类中使用了占位符类型&#xff08;类型参数&#xff09;的类。通过使用泛型类&#xff0c;你可以编写可以处理多种数据类型的代码&#xff0c;而无需为每种类型编写单独的类。泛型类使得代码更具通用性和可重用性&#xff0c;同时可以保…

基于 Redis GEO 实现条件分页查询用户附近的场馆列表

&#x1f3af; 本文档详细介绍了如何使用Redis GEO模块实现场馆位置的存储与查询&#xff0c;以支持“附近场馆”搜索功能。首先&#xff0c;通过微信小程序获取用户当前位置&#xff0c;并将该位置信息与场馆的经纬度数据一同存储至Redis中。利用Redis GEO高效的地理空间索引能…