【容器网络】跨主通信网络实现方法之host-gw实现原理

news2025/7/22 21:45:53

以上是VXLAN在跨主通信的实现原理,本文讲述的是host-gw的实现原理。

目录

Host-gw

基本原理

flannel的host-gw

数据包传输过程

calico的host-gw

calico架构

BGP Peer

Node-to-NodeMesh

Route Reflector

IPIP


Host-gw

在容器生态中,提供 Host-gw解决方案的有flannel和calico。

基本原理

Host-gw的基本原理如下:

安装网络插件后,网络插件会在每台宿主机上,添加一个格式如下所示的路由规则:

< 目的容器 IP 地址段 > via < 网关的 IP 地址 > dev eth0

其中,网关的 IP 地址,正是目的容器所在宿主机的 IP 地址。即数据包的下一跳地址就是目标容器宿主机所在地址,目标容器宿主机充当了网关,这也就是host-gw名字的由来。

一旦配置了下一跳地址,那么接下来,当 IP 包从网络层进入链路层封装成帧的时候,eth0设备就会使用下一跳地址对应的 MAC 地址,作为该数据帧的目的 MAC 地址。

flannel的host-gw

在flannel中,Flannel 子网和主机的信息,都是保存在 Etcd 当中的。flanneld 只需要 WACTH 这些数据的变化,然后实时更新路由表即可。即维护路由信息是由flanneld进程维护的。

通过以下命令即可查看子网与宿主机对应关系

$ etcdctl ls /coreos.com/network/subnets

这里边记录了子网与宿主机对应关系,比如以下图中的10.244.1.0/24属于192.168.0.3/24这个主机。

在Host-gw模式下,容器通信的过程就免除了额外的封包和解包带来的性能损耗。当 IP 包从网络层进入链路层封装成帧的时候,eth0设备就会使用下一跳地址对应的 MAC 地址,作为该数据帧的目的 MAC 地址。根据实际的测试,host-gw 的性能损失大约在 10% 左右,而其他所有基于 VXLAN“隧道”机制的网络方案,性能损失都在 20%~30% 左右。

但是通过上述分析也可以看到host-gw需要宿主机在二层是连通的。

数据包传输过程

整个数据包从Node X传输到Node Y上的过程如下图所示:

当Node X 上的pod1想要访问Node Y上的pod2时flanneld会在Node X添加如下规则:

10.244.1.0/24 via 192.168.0.3 dev eth0

表示数据包的下一跳是Node Y的网关,那么接下来,当 IP 包从网络层进入链路层封装成帧的时候,eth0设备就会使用下一跳地址对应的 MAC 地址,作为该数据帧的目的 MAC 地址。显然,这个MAC 地址,正是 Node Y 的 MAC 地址。这样数据包就被发送到了Node Y 的eth0上,eth0收到数据包后,其内核网络栈从二层数据帧里拿到 IP 包后,会“看到”这个 IP 包的目的 IP 地址是 10.244.1.2,即 container1的 IP 地址。这时候,根据 Node Y上的路由表,该数据包进入cni0 网桥,最后进入到 container1 当中。

calico的host-gw

不同于flannel模式,calico会为每一个Pod 创建一对veth设备,其中一端作为Pod 的网络接口,另一端(名称以cali为前缀,后面接随机数字串)留置在节点的根网络名称空间。

其次,不同于 Flannel 通过 Etcd 和宿主机上的 flanneld 来维护路由信息的做法,Calico项目使用BGP来自动地在整个集群中分发路由信息。

linux内核原生支持BGP协议,因此一个主机可以轻易的配置成边界网关。边界网关之间通过 TCP 传输路由信息给其他的边界网关。而其他边界网关上会对收到的这些数据进行分析,然后将需要的信息添加到自己的路由表里。所以说BGP实现了大规模网络中节点路由信息共享。

BGP 的这个能力,正好可以取代 Flannel 维护主机上路由表的功能。而且,BGP 这种原生就是为大规模网络环境而实现的协议,其可靠性和可扩展性,远非 Flannel 自己的方案可比。

calico架构

下面再来看Calico 项目的架构就非常容易理解了。它由三个部分组成:

1. Calico 的 CNI 插件。这是 Calico 与 Kubernetes 对接的部分。

2. Felix。它是一个 DaemonSet,负责在宿主机上插入路由规则(即:写入 Linux 内核的FIB 转发信息库),以及维护 Calico 所需的网络设备等工作,最核心的“下一跳”路由规则,就是由 Calico 的 Felix 进程负责维护的。

3. BIRD。它就是 BGP Client ,专门负责在集群里使用 BGP 协议传输分发路由规则信息。

除了对路由信息的维护方式之外,Calico 项目与 Flannel 的 host-gw 模式的另一个不同之处,就是它不会在宿主机上创建任何网桥设备

BGP Peer

Calico 项目实际上将集群里的所有节点,都当作是边界路由器来处理,它们一起组成了一个全连通的网络,互相之间通过 BGP 协议交换路由规则。这些节点,我们称为BGP Peer

Node-to-NodeMesh

Calico 维护的网络在默认配置下,是一个被称为“Node-to-Node Mesh”的模式。这时候,每台宿主机上的 BGP Client 都需要跟其他所有节点的 BGPClient 进行通信以便交换路由信息。但是,随着节点数量 N 的增加,这些连接的数量就会以 N²的规模快速增长,从而给集群本身的网络带来巨大的压力。所以,Node-to-Node Mesh 模式一般推荐用在少于 100 个节点的集群里。而在更大规模的集群中,你需要用到的是一个叫作 Route Reflector 的模式

Route Reflector

在Route Reflector模式下,Calico 会指定一个或者几个代表的节点,来负责跟所有节点建立 BGP 连接从而学习到全局的路由规则。而其他节点,只需要跟这几个专门的节点交换路由信息,就可以获得整个集群的路由规则信息了。这些专门的节点,就是所谓的 Route Reflector 节点,它们实际上扮演了“中间代理”的角色,从而把 BGP 连接的规模控制在 N 的数量级上

IPIP

在calico的host-gw模式中,如果跨主通信的两台主机二层网络不连通,需要通过三层路由器转发将两个宿主机网络连通才可以,并且此时需要打开其IPIP模式

在 Calico 的 IPIP 模式下,Felix 进程在 Node X上添加的路由规则,会稍微不同,如下所示:

10.244.1.0/24 via 192.168.2.2 dev tunl0

可以看到,尽管这条规则的下一跳地址仍然是 Node Y 的 IP 地址,但这一次,要负责将 IP包发出去的设备,变成了 tunl0。注意,是 T-U-N-L-0,而不是 Flannel UDP 模式使用的T-U-N-0(tun0),这两种设备的功能是完全不一样的。

Calico 使用的这个 tunl0 设备,是一个 IP 隧道(IP tunnel)设备。

IP 包进入 IP 隧道设备之后,就会被 Linux 内核的 IPIP 驱动接管。IPIP驱动会将这个 IP 包直接封装在一个宿主机网络的 IP 包中。

得到的数据包结构如下图

由于宿主机之间已经使用路由器配置了三层转发,也就是设置了宿主机之间的“下一跳”。所以这个 IP 包在离开 Node X之后,就可以经过路由器,最终“跳”到 Node Y 上。这时,Node Y 的网络内核栈会使用 IPIP 驱动进行解包,从而拿到原始的 IP 包。然后,原始 IP 包就会经过路由规则和 Veth Pair 设备到达目的容器内部。

整个过程的数据包传送如下图中绿色线条所示:

可以看到,calico的IPIP模式,会存在一些封包解包问题,实际效率上来说和flannel VXLAN模式差不多。所以,在实际使用时,应尽量避免将多个主机放在不同子网,避免使用IPIP模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Seata AT模式TransactionHook会被莫名删除?

前言 兄弟们&#xff0c;刚刚又给seata社区修了一个BUG&#xff0c;有用户提了issue反应TransactionHook在某些情况下不会被调用&#xff1a; 该用户在issue中已经指出了相关问题所在&#xff1a; 下面我们来看一下到底是什么原因导致了上述BUG的产生。 问题定位 根据用户的…

最新JMeter面试题,紧扣面试实际要求,看完拿下20K

JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言&#xff0c;JMeter小巧轻便且免费&#xff0c;逐渐成为了主流的性能测试工具&#xff0c;是测试人员必须要掌握的工具之一。 下面小编给大家总结了22年最新30道关于JMeter的面试题&#xff0c;…

基于51单片机的温度报警系统

功能&#xff1a; 设计一个温度报警系统&#xff0c;可以设定温度上、下限的值&#xff0c;到达设定值时&#xff0c;蜂鸣器响&#xff1b;按键设定有设置、确定、取消、减少与增加功能&#xff0c;LCD1602实时显示相关温度信息 设定界面&#xff1a; 温度超过设定值&#xf…

美国能源部国家实验室将量子计算用于关键能源研究

​ &#xff08;图片来源&#xff1a;网络&#xff09; 量子计算是一种新兴的、强大而有前途的且能快速解决复杂问题的新力量&#xff0c;美国能源部国家实验室NETL的专家正准备将量子计算投入到关键能源的研究课题上&#xff0c;以实现环境可持续和能源应用的无限未来。 量子…

【MySQL | 运维篇】05、MySQL 分库分表之 使用 MyCat 分片

目录 一、垂直拆分 1.1 场景 1.2 准备 1.3 配置 1). schema.xml 2). server.xml 1.4 测试 1). 上传测试SQL脚本到服务器的 /root/sql 目录 2). 执行指令导入测试数据 3). 查询用户的收件人及收件人地址信息(包含省、市、区)。 4). 查询每一笔订单及订单的收件地址信息…

html页面广告5秒之后跳过

首页 - <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width; in…

【51】分布式计算:如果所有人的大脑都联网会怎样?

【计算机组成原理】学习笔记——总目录 【51】分布式计算&#xff1a;如果所有人的大脑都联网会怎样&#xff1f;引言一、从硬件升级到水平扩展二、理解高可用性和单点故障三、总结【个人总结的重点】引言 现在我们每天在用的个人 PC、智能手机&#xff0c;乃至云上的服务器&a…

Nginx反向代理配置

关键字&#xff1a; 反向代理&#xff0c;负载均衡 第一步&#xff1a;官网下载windwos版本nginx 下载地址链接:nginx: download 如下图所示 第二步&#xff1a;解压启动nginx 备注&#xff1a;启动前先查看进程是否占用 80端口 netstat ano | findstr 80tasklist |findstr “…

linux下Nerdtree安装方法

目录 1.下载Nerdtree 2. linux下安装 3. 成功享受吧 1.下载Nerdtree 百度网盘下载&#xff0c;地址为链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;07e3 --来自百度网盘超级会员V4的分享 github方式下载&#xff0c;地址为 https://github.com/scrooloose/ner…

【附源码】Python计算机毕业设计蔬果批发网络平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

HECTF2022 学习笔记

HECTF2022 MISC笔记 目录HECTF2022 MISC笔记小鲨鱼来喽~舞者的秘密你把我的flag藏哪去了。。小鲨鱼来喽~ 查看最后面的http数据包&#xff0c;发现flag 舞者的秘密 先爆破出压缩包密码&#xff0c;用010打开&#xff0c;发现文件开头是gif的格式 将图片格式改为gif&#xf…

Mysql之常用函数、聚合函数合并(unionunion all)【第四篇】

大纲&#xff1a; 1、函数的简介 MySQL函数是 MySQL 数据库提供的内部函数&#xff0c;这些内部函数可以帮助用户更加方便地处理表中的数据。函数就像预定的公式一样存放在数据库里&#xff0c;每个用户都可以调用已经存在的函数来完成某些功能。 简单来说&#xff0c;函数就是…

Sublime Text v4.0(4143)破解方法

[TOC](Sublime Text v4.0(4143)破解方法) 版本Sublime Text v4.0(4143) 所需软件 Sublime Text v4.0(4143)下载地址&#xff1a;https://www.sublimetext.com/download_thanks?targetwin-x64 010 Editor下载地址(其他十六进制编辑器也可以) https://download.sweetscape.co…

基于ISO13209(OTX)实现EOL下线序列

一 OTX是什么&#xff1f; OTX&#xff0c;全称Open Test sequence eXchange format&#xff0c;即开放式测试序列交换格式&#xff0c;国际标准&#xff1a;ISO13209&#xff0c;是专为汽车行业制定的序列开发标准。在车辆诊断、自动化标定和ECU测试等领域有广泛应用。OTX不仅…

使用Jmeter进行性能测试的操作方法

前言 JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c; 下载地址&#xff1a; Apache JMeter - Download Apache JMeter 下载好之后 &#xff0c;他得需要 jdk配置 好环境变量 才能运行。 这是很重要的一点&#xff0c; 。 安装 一系…

高数 |【23数一 李林六套卷】卷二 自用思路 及 知识点 整理

23数一 李林六套卷 —— 自用思路 及 知识点 整理 ——【卷二】 以下均为个人复盘。 部分思路讲解参考于 6-2_哔哩哔哩_bilibili 第二套T22_哔哩哔哩_bilibili T1:泰勒 ※ T2:高阶导 想泰勒展开 或 本题画图 法一:泰勒 法二:画图

哈夫曼树及其应用

一、基本概念 给定N个权值作为N个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若该树的带权路径长度达到最小&#xff0c;称这样的二叉树为最优二叉树&#xff0c;也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树&#xff0c;权值较大的结点离根较近。 ——…

Web前端:如何提高React原生应用性能

React Native拥有大量追随者&#xff0c;从财富500强公司到新的创业公司。开发人员可以使用React Native为IOS和Android上的移动应用程序创建出色的移动UI。 随着React Native的一切进展顺利&#xff0c;它甚至有负面影响吗?是的&#xff0c;确实如此。这是React Native应用程…

整形提升和算术转换

表达式求值 表达式求值的一部分由符号的优先级和结合性决定。 同时&#xff0c;表达式求值一部分也与数据类型的转换有关。 文章目录1.隐式类型转换2.算术转换1.隐式类型转换 C的整数类型运算总是至少以缺省整形类型的精度来进行的。&#xff08;缺省就是如果程序员没定义函数…

【学习日志】2022.11.11 合同矩阵、惯性指数、委托构造、继承控制、=delete、可变参数模板类

class Info { public:Info() : Info(1) { } // 委托构造函数Info(int i) : Info(i, a) { } // 既是目标构造函数&#xff0c;也是委托构造函数Info(char e): Info(1, e) { }private:Info(int i, char e): type(i), name(e) { /* 其它初始化 */ } // 目标构造函数int type;c…