【博客585】ipvs场景下dummy网卡的作用

news2024/11/15 19:44:46

linux ipvs模式下dummy网卡的作用

1、场景:

在使用ipvs来实现vip的负载均衡的时候,有时我们会在linux中创建一块dummy网卡,并在网卡上绑上vip

2、场景示例:k8s kube-proxy组件的ipvs模式

kube-proxy在ipvs模式下生成了一块kube-ipvs0虚拟网卡,并且在上面绑定了service ip

[root@master140 ~]# ip addr
5: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default 
    link/ether d2:b0:08:01:3e:52 brd ff:ff:ff:ff:ff:ff
    inet 172.18.13.31/32 brd 172.18.13.31 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 172.18.13.1/32 brd 172.18.13.1 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 172.18.13.187/32 brd 172.18.13.187 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 172.18.13.113/32 brd 172.18.13.113 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 172.18.13.222/32 brd 172.18.13.222 scope global kube-ipvs0
       valid_lft forever preferred_lft forever

还会为vip生成route规则

[root@master140 ~]# ip route show table local
local 172.18.13.1 dev kube-ipvs0 proto kernel scope host src 172.18.13.1 
local 172.18.13.31 dev kube-ipvs0 proto kernel scope host src 172.18.13.31 
local 172.18.13.113 dev kube-ipvs0 proto kernel scope host src 172.18.13.113 
local 172.18.13.187 dev kube-ipvs0 proto kernel scope host src 172.18.13.187 
local 172.18.13.222 dev kube-ipvs0 proto kernel scope host src 172.18.13.222 

同时还会生成ipvs规则

[root@master140 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  127.0.0.1:30001 rr
TCP  127.0.0.1:30002 rr
  -> 10.0.3.5:8080                Masq    1      0          0         
  -> 10.0.3.7:8080                Masq    1      0          0         
TCP  127.0.0.1:30094 rr
  -> 10.0.3.2:80                  Masq    1      0          0         
TCP  172.17.0.1:30001 rr
TCP  172.17.0.1:30002 rr
  -> 10.0.3.5:8080                Masq    1      0          0         
  -> 10.0.3.7:8080                Masq    1      0          0         
TCP  172.17.0.1:30094 rr
  -> 10.0.3.2:80                  Masq    1      0          0         
TCP  172.18.13.1:443 rr
  -> 192.168.204.142:6443         Masq    1      0          0         
TCP  172.18.13.31:80 rr
TCP  172.18.13.113:8082 rr
  -> 10.0.3.5:8080                Masq    1      0          0         
  -> 10.0.3.7:8080                Masq    1      0          0         
TCP  172.18.13.187:3306 rr
  -> 10.0.3.4:3306                Masq    1      0          0         
TCP  172.18.13.222:80 rr
  -> 10.0.3.2:80                  Masq    1      0          0         
TCP  192.168.204.142:30001 rr
TCP  192.168.204.142:30002 rr
  -> 10.0.3.5:8080                Masq    1      0          0         
  -> 10.0.3.7:8080                Masq    1      0          0         
TCP  192.168.204.142:30094 rr
  -> 10.0.3.2:80                  Masq    1      0          0         
TCP  10.0.1.0:30001 rr
TCP  10.0.1.0:30002 rr
  -> 10.0.3.5:8080                Masq    1      0          0         
  -> 10.0.3.7:8080                Masq    1      0          0         
TCP  10.0.1.0:30094 rr
  -> 10.0.3.2:80                  Masq    1      0          0         

3、ipvs模式下的dummy网卡作用

先看下ipvs转发的流转图:
在这里插入图片描述
过程:

  • 1、当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。

  • 2、PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。

  • 3、ipvs会监听到达input链的数据包,比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP。

  • 4、POSTROUTING链通过选路,将数据包发送给Real Server

  • 5、Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP。

  • 6、Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。

新增网卡和route的作用:

由于 IPVS 的 DNAT 钩子挂在 INPUT 链上,因此必须要让内核识别 VIP 是本机的 IP。这样才会过INPUT 链,要不然就通过OUTPUT链出去了。k8s 通过设置将service cluster ip 绑定到虚拟网卡kube-ipvs0。

以cni为flannel为例,此时流转图变成这样,有了dummy网卡后,service ip的流量就能进入input链,从而执行ipvs的hook,进行dnat
在这里插入图片描述

ipvs的hook:

在这里插入图片描述
具体hook定义:

static const struct nf_hook_ops ip_vs_ops[] = {
	/* After packet filtering, change source only for VS/NAT */
	{
		.hook		= ip_vs_reply4,
		.pf		= NFPROTO_IPV4,
		.hooknum	= NF_INET_LOCAL_IN,
		.priority	= NF_IP_PRI_NAT_SRC - 2,
	},
	/* After packet filtering, forward packet through VS/DR, VS/TUN,
	 * or VS/NAT(change destination), so that filtering rules can be
	 * applied to IPVS. */
	{
		.hook		= ip_vs_remote_request4,
		.pf		= NFPROTO_IPV4,
		.hooknum	= NF_INET_LOCAL_IN,
		.priority	= NF_IP_PRI_NAT_SRC - 1,
	},
	/* Before ip_vs_in, change source only for VS/NAT */
	{
		.hook		= ip_vs_local_reply4,
		.pf		= NFPROTO_IPV4,
		.hooknum	= NF_INET_LOCAL_OUT,
		.priority	= NF_IP_PRI_NAT_DST + 1,
	},
	/* After mangle, schedule and forward local requests */
	{
		.hook		= ip_vs_local_request4,
		.pf		= NFPROTO_IPV4,
		.hooknum	= NF_INET_LOCAL_OUT,
		.priority	= NF_IP_PRI_NAT_DST + 2,
	},
	/* After packet filtering (but before ip_vs_out_icmp), catch icmp
	 * destined for 0.0.0.0/0, which is for incoming IPVS connections */
	{
		.hook		= ip_vs_forward_icmp,
		.pf		= NFPROTO_IPV4,
		.hooknum	= NF_INET_FORWARD,
		.priority	= 99,
	},
	/* After packet filtering, change source only for VS/NAT */
	{
		.hook		= ip_vs_reply4,
		.pf		= NFPROTO_IPV4,
		.hooknum	= NF_INET_FORWARD,
		.priority	= 100,
	},
...

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

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

相关文章

iperf工具源码下载、编译、编译报错解决、以及测试网络带宽

1、iperf源码下载 (1)源码下载地址&#xff1a;https://iperf.fr/iperf-download.php; (2)有的版本源码下载下来并不能直接编译成功&#xff0c;可能会报缺少头文件或者编译选项的错误&#xff0c;要么去解决这些错误&#xff0c;要么换个版本再试一下&#xff1b; (3)在我的环…

Linux学习【教程+实操】【超基础】

链接:资料提取码&#xff1a;6klp 今日内容Linux简介Linux安装网卡设置安装SSH连接工具Linux和Windows目录结构对比Linux常用命令Linux命令初体验文件目录操作命令拷贝移动命令打包压缩命令文本编辑命令查找命令Linux软件安装软件安装方式安装jdk&#xff08;采用二进制发布包…

mysql索引字段设计

表字段数量与row大小限制可以参考官方文档 https://dev.mysql.com/doc/refman/8.0/en/column-count-limit.html#column-count-limits 复合索引 参考&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/innodb-limits.html 数量限制 一个复合索引最多可以包含16个列&…

微信小程序--自定义组件

组件的创建与引用 1.创建组件 在项目的根目录中&#xff0c;鼠标右键&#xff0c;创建 components -> test 文件夹 在新建的components -> test文件夹上&#xff0c;鼠标右键&#xff0c;点击“新建Component" 键入组件的名称之后回车&#xff0c;会自动生成组件对…

C语言进阶(9)——C语言文件操作

本章重点 为什么使用文件什么是文件文件的打开和关闭文件的顺序读写文件的随机读写文本文件和二进制文件文件读取结束的判定文件缓冲区 文章目录本章重点1.为什么使用文件2.什么是文件2.1程序文件2.2数据文件2.3文件名3.文件打开和关闭3.1 文件指针3.2文件的打开和关闭4. 文件…

【蓝桥杯嵌入式】第十一届蓝桥杯嵌入式省赛(第二场)程序设计试题及其题解

题目再现 题目分析 通过阅读本届试题可知&#xff0c;其功能比较单一&#xff0c;除了试题中常客——LED、LCD、按键三巨头外&#xff0c;还包含了定时器的PWM以及ADC读取这两个部分&#xff0c;考察的重点在于对定时器产生PWM的应用以及如何修改PWM的占空比&#xff0c;完全消…

MPU-6000(6050)介绍

MPU-6000&#xff08;6050&#xff09;简介MPU-60X0是全球首例9 轴运动处理传感器。它集成了3 轴MEMS陀螺仪&#xff0c;3 轴MEMS加速度计&#xff0c;以及一个可扩展的数字运动处理器DMP&#xff08;DigitalMotion Processor&#xff09;&#xff0c;可用I2C接口连接一个数字传…

react PureComponent

这个 其实和我之前写的文章react组件优化&#xff0c;当父组件数据变化与子组件无关时&#xff0c;控制子组件不重新渲染实现的东西是一样的 只是用了一种更简洁的方式 我们还是重新来一次 创建一个react项目 然后 创建一个子组件 我这里就直接叫 subset.jsx 参考代码如下 i…

ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION

核心 Adam: 一种基低阶矩的自适应估计的随机目标函数的一阶梯度优化算法&#xff0c;该方法实现简单**&#xff0c;计算效率高&#xff0c;内存需求很少**&#xff0c;对梯度的对角线重新缩放不变&#xff0c;并且非常适合于在数据或参数方面较大问题&#xff0c;该方法也适用…

ADI demo PS工程的编译-以adrv9371x_zc706为例子

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 ADI demo PS工程的编译-以adrv9371x_zc706为例子前言VITIS建工程总结前言 接《ADI demo PL工程的编译-以adrv9371x_zc706为例子之使用Cygwin》这篇。导出XSA文件&#xff0c…

VMware虚拟机搭建安装MacOS13及开发环境搭建

文章目录前言准备工作&#xff1a;安装虚拟机及MacOS系统1.安装VMware 虚拟机2. 运行解锁工具3. 安装macOS 134. 配置网络5. 安装VMware tools开发环境1. 安装xcode2. 安装HbuilderX前言 终于把macOS13虚拟机安装好了&#xff0c;比起上次安装macOS10,这次走了很多弯路。 先说…

108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树 难度简单1214 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1&…

春节期间商城如何做好运营

有经验的商家都知道&#xff0c;春节对于店铺来说&#xff0c;这是一个全新的起点&#xff0c;所以商家们一定要抓住新年这个过渡期的时机。那么在春节期间的运营该如何做呢&#xff1f; 首先看看春节期间会有的几个问题&#xff1a; 推广竞争会比较小&#xff0c;在这个时间…

git使用日常问题记录【按日期频繁记录,欢迎收藏】

git系列文章 文章目录2023.1.14 将gitee仓库转移到github遇到的问题1-1 add到暂存区&#xff0c;commit到仓库之后&#xff0c;不想push了&#xff1f;&#xff1f;&#xff1f;1-2 git push大文件失败解决1-3 上传多余文件&#xff0c;如何从远端仓库中删除2023.1.151-1 githu…

销售管理系统 | 数据库课设

文章目录前言项目介绍E-R图表结构系统总体框架搭建项目环境介绍创建网站主页连接数据库注册功能登录功能管理员登录功能注销登录功能个人信息后台管理查看供应商名单删除功能修改功能登记货物信息功能购买商品功能总源码教训总结前言 为了期末的数据库课设&#xff0c;这是最初…

【C++】STL - Stack - Queue - PriorityQueue使用和模拟实现

&#x1f431;作者&#xff1a;傻响 &#x1f431;专栏&#xff1a;《数据结构_STL》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 栈 Stack介绍 模拟实现 队列 Queue介绍 常用的函数接口介绍 模拟实现 优先级队列 Priority…

【docker18】docker容器之CAdvisor+InfluxDB+Granfana

1.原生命令 1.1操作 命令&#xff1a; docke stats 1.2问题 通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU&#xff0c;内存以及网络流量控制等数据&#xff0c;一般的小公司够用了。 但是&#xff0c;docker stats统计结果只能是当前宿主机的全部容器&am…

669. 修剪二叉搜索树

669. 修剪二叉搜索树 难度中等 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c…

SourceTree使用方法总结

SourceTree使用方法总结 SourceTree使用总结 添加仓库 mac下从url克隆&#xff1a; windows下从url克隆&#xff1a; 抓取、获取分支信息 抓取&#xff08;mac下的名字&#xff09;获取&#xff08;Windows下的名字&#xff09;指获取服务端git库的变更信息&#xff0c;比如…

基于FPGA的UDP 通信(五)

引言 前文链接&#xff1a; 基于FPGA的UDP 通信&#xff08;一&#xff09; 基于FPGA的UDP 通信&#xff08;二&#xff09; 基于FPGA的UDP 通信&#xff08;三&#xff09; 基于FPGA的UDP 通信&#xff08;四&#xff09; 本文基于FPGA设计千兆以太网通信模块UDP数据发…