当前位置: 首页 > news >正文

ip_vs 原理解析 (四)hook 后的开始 一

文章目录

  • ip_vs hook 后
    • NF_INET_LOCAL_IN

本章重点:
k8s 如何利用 ip_vs 实现源 IP 会话亲和性。

ip_vs hook 后

NF_INET_LOCAL_IN

根据优先级依次是 ip_vs_reply4,ip_vs_remote_request4

ip_vs_reply4| -- ip_vs_out| -- skb_to_full_sk(skb)| -- ip_vs_fill_iph_skb  // 解析 IP 头| -- ip_vs_out_icmp // 如果是 icmp| -- cp = pp->conn_out_get // 如果没有 conn 链接,直接 ACCEPT| -- handle_response_icmp // 回复 icmp| -- ip_vs_nat_icmp // 做 nat| -- ip_vs_update_conntrack // 更新 nf_ct| -- __ip_vs_conn_put // 更新 ipvs conn 引用计数| -- ip_vs_proto_data_get // 通过 协议找到 ipvs 链表| -- pp->conn_out_get // 查找是否有 conn,属于一个存在的 out 连接| -- handle_response // 查到连接,回复做 snat 处理--- 没有连接的特殊情况| -- 进来的报文根据源 ip 和 源 port 也就是 ipvs 的 rs 的 ip 和端口进行查询,如果有且是 UDP 或 TCP&!RESET 的情况,发送 icmp_dest_unreach/icmp_port_unreach,drop。

全是查 conn_out_get,没有再 ACCEPT; 说明,这个 hook 是处理回复的 ip_vs,然后全是 nat 模式的 ipvs。即处理 realserver 回复报文时的处理。
conn_out_get 对应对应协议的连接查询,如 tcp/udp/sctp 为 ip_vs_conn_out_get_proto;
像 k8s 的 service 需要重点关注,这是后端 pod 回复到 client 所在节点后的处理流程。

ip_vs_remote_request4

ip_vs_remote_request4
| -- ip_vs_in| -- (skb->pkt_type != PACKET_HOST && hooknum != NF_INET_LOCAL_OUT) 不是本地包,ipvs 不处理| -- ip_vs_fill_iph_skb  // 解析 IP 头| -- pd = ip_vs_proto_data_get(ipvs, iph.protocol);| -- pp = pd->pp;| -- cp = pp->conn_in_get(ipvs, af, skb, &iph);    // 根据报文协议,找到对应的 conn 表,查询报文是否属于已存在的 连接| -- (conn_reuse_mode && !iph.fragoffs && is_new_conn(skb, &iph) && cp) // 判断 内核开启 reuse_mode,不是分片,新连接(tcp syn),查到 连接 (连接 reuse)| -- tcp 连接的状态是否允许 reuse (TIME_WAIT,CLOSE...)| -- 没有 连接和可 reuse 的连接| -- ip_vs_try_to_schedule| -- conn_schedule 对应协议的 conn_schedule  // tcp 的 tcp_conn_schedule| -- tcp_conn_schedule    根据报文查询 ipvs 的 service| -- ip_vs_schedule    ipvs 主要函数,调度去获取真实的后端| -- 检查是否已存在连接,只调度未存在连接的情况| -- 有连接| -- 对 连接 加计数| -- 没有连接| -- ip_vs_sched_persist   // 持久属性的 svc,详细内容见下一块| -- sched->schedule // 通过 svc 的调度器调度处 dest| -- ip_vs_conn_new 创建连接| -- ip_vs_bind_xmit,根据 svc 的模式绑定发包规则(包括 nat/tunnel/dr/bypass,k8s service 为 ip_vs_nat_xmit)| -- cp->packet_xmit 用 绑定的方法处理报文

关于 conn_reuse,是在考虑 ip_vs 的优雅关闭后端和 高并发下 端口重用的兼容问题。大致意思:在连接尚未结束时,还是会将数据发到准备去掉的 rs,端口重用会丢掉第一个 syn 包导致重传;所以在 k8s 场景下不建议两个全开,ps 我们不开 reuse。

ip_vs_sched_persist
在 k8s 环境中通常是 sessionAffinity: ClientIP 属性的 service 配置的。设置源 IP 亲和性,同一个 clientIP 调度到同一个 real server。

| -- ip_vs_sched_persist    根据模版创建连接,如果没有创建模板,支持 TCP/UDP,通常 sip 模式使用;| -- ip_vs_conn_fill_param_persist 填充 param 并查找对应的 template,填充如果是 persist 的svc,还需要调用 对应调度器的 fill_param 函数| -- ip_vs_ct_in_get   根据 param 查找 ct template| -- ip_vs_check_template 如果有 模板,进行判断,如果有后端,后端是否正常,如果不正常,将 ct 目的端口,svc 端口改为 65535,然后更新| -- dest = sched->schedule 如果没找到模板 或者 ct 后端无效,进行此方法调度,调度为创建 svc 的方法,前文已介绍| --  ip_vs_conn_new 用新调度到的后端创建连接模板 即 ip_vs 的 ct,ct 的 timeout 由 svc 的 timeout 获取。
| -- 查到 template ct| -- dest = ct->dest; 直接获取 ct 的 dest| -- 修改 目的 port 从 svc 的 port 到 dest 的 port| -- ip_vs_conn_new 根据 template 创建连接| -- ip_vs_control_add 将连接的 controller 改为 模板| -- ip_vs_conn_put 将模板的计时重置| -- ip_vs_conn_stats 更新计数等

可以大致清楚 k8s service 的会话亲和性是如何利用 ip_vs 的 sip 来实现的 ,ip_vs sip 实际上开始是为了支持 SIP 协议(会话初始协议),pe 的数据主要是存储 SIP 协议中的 callid,通过 pe 的匹配来保证会话亲和性。
会话亲和性,主要实现是先生成一个根据源 IP 创建的 template 连接,然后在根据模板连接生成真实连接,生成后会更新模板的有效时间。模板连接的特征是源端口为 0,且当生成的模板后端 rs 失效时,会重新生成,并把原模板更新为不可用(具体为设置 源端口为0,service 端口和目的端口为 65535)

相关文章:

ip_vs 原理解析 (四)hook 后的开始 一

文章目录 ip_vs hook 后NF_INET_LOCAL_IN 本章重点: k8s 如何利用 ip_vs 实现源 IP 会话亲和性。 ip_vs hook 后 NF_INET_LOCAL_IN 根据优先级依次是 ip_vs_reply4,ip_vs_remote_request4 ip_vs_reply4| -- ip_vs_out| -- skb_to_full_sk(skb&#xf…...

【论文解读】基于图的自监督学习联合嵌入预测架构

一、简要介绍 本文演示了一种学习高度语义的图像表示的方法,而不依赖于手工制作的数据增强。论文介绍了基于图像的联合嵌入预测架构(I-JEPA),这是一种用于从图像中进行自监督学习的非生成性方法。I-JEPA背后的idea很简单&#xff…...

C++ 容器

string 1. 构造 string s1(); // 1 string s2("hello"); // hello string s3(3, k); // kkk string s4("hellohello", 2, 4); // lloh2. 赋值 string s1 "hellohello"; // hellohello string s2.assign(s1); // he…...

【PHP】PHP文件操作详解

PHP是一种广泛使用的服务器端脚本语言,用于开发Web应用程序。在PHP中,文件操作是一项重要的功能,包括文件的读取、写入、删除和其他操作。本文将详细介绍PHP文件操作的各个方面,并通过示例代码进行说明。 一、文件读取 要读取一…...

硬核旗舰南卡OE CC开放式耳机发布,重新定义百元开放式耳机新标杆!

​随着现在健康意识的不断提高,人们对于日常用品的要求越来越高,在耳机市场中,健康因素也逐渐成为消费者所考虑的因素之一,入耳式耳机因为会引发中耳炎、耳膜炎等疾病,正在逐渐被开放式蓝牙耳机所取代,南卡…...

785. 判断二分图

785. 判断二分图 原题链接:完成情况:解题思路:参考代码: 原题链接: 785. 判断二分图 https://leetcode.cn/problems/is-graph-bipartite/description/ 完成情况: 解题思路: 题目解释&#x…...

限时 180 天,微软为 RHEL 9 和 Ubuntu 22.04 推出 SQL Server 2022 预览评估版

导读近日消息,微软公司今天发布新闻稿,宣布面向 Red Hat Enterprise Linux(RHEL)9 和 Ubuntu 22.04 两大发行版,以预览模式推出 SQL Server 2022 评估版。 近日消息,微软公司今天发布新闻稿,宣布…...

一款ccm的功率因素校正控制器ncp1654

产品概述: NCP1654是用于连续传导模式的控制器(CCM)功率因数校正升压预转换器。它控制固定频率模式下的电源开关导通时间(PWM)并且取决于瞬时线圈电流。 该电路封装在SO8封装中,最大限度地减少了外部组件&a…...

4.若依框架上传文件

1.服务端代码-控制器 /*** 上传文件*/PostMapping("/upload")Operation(summary "上传")public AjaxResult uploadFile(MultipartFile file) throws Exception {try {// 上传文件路径String filePath RuoYiConfig.getUploadPath();// 上传并返回新文件名…...

Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

项目场景: 最近因为公司业务需要在搭一个新架构,用的springboot3和jdk17,在整合mybatis多数据源的时候报错 (引用的mybatisplus 和 mybatisplusjion的是最新的包-2023-08-26) Error creating bean with name ‘XXXServiceImpl’:…...

idea的debug断点的使用

添加断点(目前不知道如何添加断点,就给AutoConfigurationImportSelector的每个方法都加上断点): 然后将StockApplication启动类以debug方式运行,然后程序就会停在119行 点击上边的step over让程序往下运行一行&#x…...

【UE】蓝图通信——事件分发器

目标 比如我现在希望点击控件蓝图A中的按钮后,蓝图B能够马上做出响应 实现步骤 1. 这里控件蓝图A叫“UI_按钮”,我在该蓝图中创建了一个名为“btnIsClicked”的事件分发器 当按钮被点击时,就会调用“btnIsClicked” 2. 蓝图B这里叫做“BP_…...

Python爬虫分布式架构问题汇总

在使用Python爬虫分布式架构中可能出现以下的问题,我们针对这些问题,列出相应解决方案: 1、任务重复执行 在分布式环境下,多个爬虫节点同时从消息队列中获取任务,可能导致任务重复执行的问题。 解决方案:…...

AIGC人工智能涉及三十六职业,看看有没有你的职业(一)

文章目录 一只弹吉他的熊猫 神奇的企鹅 功夫熊猫 视觉光影下的女子 闪光灯效 局部柔光 生物光 LOGO设计 制作儿童绘本故事 换脸艺术 打造专属动漫头像 包装设计之美 建筑设计 如何转高清图 生成3D质感图标 生成微信表情包 探索美食摄影的奇妙之旅 蛋糕创意设…...

万界星空科技/免费MES系统/免费质量检测系统

质量管理也是万界星空科技免费MES中的一个重要组成部分,旨在帮助制造企业实现全面的质量管理。该系统涵盖了供应商来料、生产过程、质量检验、数据分析等各个环节,为企业提供了一站式的质量管理解决方案。 1. 实时质量监控 质量管理能够实时监控生产过程…...

解决IndexError: index 0 is out of bounds for axis 1 with size 0

标题 引言问题背景解决思路如何防止总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭…...

Java中hashTable的基本介绍,细节讨论,使用注意事项,常用方法和底层的扩容机制

Hashtable 是 Java 标准库中提供的一个古老的散列表(Hash Table)实现,用于存储键值对。它是线程安全的,基于哈希表的数据结构。然而,由于其线程安全性引入的同步机制,使得在多线程环境下性能相对较低。在现…...

redis -实战记录

redis -实战记录 一、安装二、使用 一、安装 centos - docker安装redisWindows10安装redis(图文教程) 二、使用 node-red进行读写redis...

Mysql知识梳理

Mysql知识梳理 索引索引分类索引未命中的原因性能调优命令Explain回表 mysql性能优化事务四大特性事务隔离级别设置事务隔离级别 存储引擎聚簇索引和非聚簇索引聚簇索引非聚簇索引 最左前缀结合原则全文索引 索引 索引分类 mysql有普通索引、空间索引、主键索引、唯一索引、组…...

文生图模型之Stable Diffusion

原始文章地址 autoencoder CLIP text encoder tokenizer最大长度为77(CLIP训练时所采用的设置),当输入text的tokens数量超过77后,将进行截断,如果不足则进行paddings,这样将保证无论输入任何长度的文本&…...

Java List循环安全删除元素

Java List循环安全删除元素的几种方式如下: 使用迭代器(Iterator):通过调用List的iterator()方法获取List的迭代器,然后使用迭代器的remove()方法删除元素。这种方式可以避免在遍历过程中修改List导致的并发修改异常&…...

2023年03月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:和数 给定一个正整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。 时间限制:10000 内存限制:65536 输入 共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个…...

bert-base-chinese 判断上下句

利用BERT等模型来实现语义分割。BERT等模型在预训练的时候采用了NSP&#xff08;next sentence prediction&#xff09;的训练任务&#xff0c;因此BERT完全可以判断两个句子&#xff08;段落&#xff09;是否具有语义衔接关系。这里我们可以设置相似度阈值 MERGE_RATIO &#…...

vue3+vue-cli使用mockjs

1.下载mockjs包 npm i mockjs -D 2.main.js中全局引入 // mock模拟后端数据 import /mock/index.js 3.axios下baseUrl注释掉&#xff0c;让其不走本地代理 // 使用mock数据的话&#xff0c;将这一项注释即可 // axios.defaults.baseURL process.env.VUE_APP_BASE_API; 4.s…...

Android 全局监听软键盘弹起隐藏 动态修改布局并适配无限循环的问题

思路&#xff1a; 要在 Android 应用中全局检测软键盘的弹起&#xff0c;您可以使用 ViewTreeObserver.OnGlobalLayoutListener 监听器来监听布局树的变化。当软键盘弹起或隐藏时&#xff0c;布局树会发生变化&#xff0c;因此您可以在监听器中捕获这些变化。 以下是一个示例…...

第 k 小整数

题目描述 现有 n 个正整数&#xff0c;要求出这 n 个正整数中的第 k 个最小整数&#xff08;相同大小的整数只计算一次&#xff09;。 输入格式 第一行为 n 和 k; 第二行开始为 n 个正整数的值&#xff0c;整数间用空格隔开。 输出格式 第kk个最小整数的值&#xff1b;若无…...

LeetCode 1448. 统计二叉树中好节点的数目:DFS

【LetMeFly】1448.统计二叉树中好节点的数目 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-good-nodes-in-binary-tree/ 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点…...

AR室内导航技术之技术说明与效果展示

随着科技的飞速发展&#xff0c;我们周围的环境正在经历着一场数字化的革命。其中&#xff0c;AR室内导航技术以其独特的魅力&#xff0c;为我们打开了一扇通往全新数字化世界的大门。本文将为您详细介绍这一技术的实现原理、工具应用以及成品展示&#xff0c;带您领略AR室内导…...

06-Numpy基础-线性代数

线性代数&#xff08;如矩阵乘法、矩阵分解、行列式以及其他方阵数学等&#xff09;是任何数组库的重要组成部分。 NumPy提供了一个用于矩阵乘法的dot函数&#xff08;既是一个数组方法也是numpy命名空间中的一个函数&#xff09; x.dot(y)等价于np.dot(x, y) 符&#xff08;…...

SpringBootWeb 登录认证

登录认证&#xff0c;那什么是认证呢&#xff1f; 所谓认证指的就是根据用户名和密码校验用户身份的这个过程&#xff0c;认证成功之后&#xff0c;我们才可以访问系统当中的信息&#xff0c;否则就拒绝访问。 在前面的案例中&#xff0c;我们已经实现了部门管理、员工管理的…...