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

这篇具有很好参考价值的文章主要介绍了ip_vs 原理解析 (四)hook 后的开始 一。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


本章重点:
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)文章来源地址https://www.toymoban.com/news/detail-674519.html

到了这里,关于ip_vs 原理解析 (四)hook 后的开始 一的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解析 IP(IPv4)地址

    为了保证正常通信,有必要为每个设备配置正确的 IP 地址。在互联网通信中,全世界都必须设定正确的IP地址。否则,根本无法实现正常的通信。而在用 TCP/IP 进行通信时,需要用 IP 地址识别主机和路由器。 IPv4 地址在计算机中是由如下这样构成的 四组二进制数 每组八位二

    2024年04月28日
    浏览(31)
  • 网络层&&IP协议的基本原理 数据链路层&&ARP协议 域名解析以及一些重要技术

    网络层作用:在复杂的网络环境中确定一个合适的路径。 tcp/ip协议,tcp解决可靠性与效率,ip提供在网络中传输的能力。 传输层决定了单次向下交付数据包的大小。 IP(Internet Protocol)协议是一种网络层协议,用于在互联网上进行数据传输。它定义了数据如何在网络中进行分

    2024年02月15日
    浏览(32)
  • 软考系分之计算机网络IP地址的表示(IPv4及IPv6)

      本篇介绍计算机网络中的IP地址,在网络工程师的考试中,IP地址是必考内容,但是在系统分析师的考察中,IP地址的考查重点,应该就是IPv4和IPv6的相关概念和IPv4中简单的子网划分计算了。 2.1 IPv4分类表示   IP地址中,机器存放IPv4是32位二进制代码,每隔8位插一个空格

    2024年01月18日
    浏览(39)
  • TCP/IP协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4报文格式

    目录 一、什么是IP分片 二,为什么要进行IP分片 三、IP分片原理及分析 标志字段的作用  下面是标志位在IP首部中的格式以及各个标志的意义:  TTL  Protocol 协议号 分片包文示例: 分片偏移量计算方法:  第一个分片:  第二个分片:  第三个分片: IP分片是网络上传输IP报

    2024年02月02日
    浏览(41)
  • 【软考网络管理员】2023年软考网管初级常见知识考点(10)- 网际协议IP及IPV6,IPV4详解

    分类的IP地址,子网划分,CIDR和路由汇聚,IPV4数据报格式,IPV6协议,软考网络管理员常考知识点,软考网络管理员网络安全,网络管理员考点汇总。 原创于:CSDN博主-《拄杖盲学轻声码》,更多考点汇总可以去他主页查看 更多考试总结可关注CSDN博主-《拄杖盲学轻声码》 这

    2024年02月11日
    浏览(33)
  • 网络层之IP数据报格式、数据报分片、IPv4、子网划分和子网掩码

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需写作干货注入能量… 热爱写作,愿意让自己成为更好

    2024年02月05日
    浏览(32)
  • 详解【计算机类&面试真题】军队文职考试——第4期(真题+解析):网络时延的组成部分和产生,使用Python来计算传输时延和传播时延 | TIP/IP网络协议的核心是什么?| DNS域名系统的工作原理

      决定放弃了的事,就请放弃得干干净净,那些决定再也不见面的人,就真的不要再见面了。     🎯作者主页: 追光者♂🔥          🌸个人简介:   💖[1] 计算机专业硕士研究生💖   🌟[2] 2022年度博客之星人工智能领域TOP4🌟   🏅[3] 阿里云社区特邀专家博主🏅  

    2024年02月09日
    浏览(46)
  • 科普知识:IPv4 vs IPv6

    这几天关于IPv4地址耗尽的报道几乎天天有啊……这东西倒底和我们的生活有什么关系呢? IPv4是指IP(Internet Protocol)协议第4版,IPv6就是第6版了(至于第5版是什么,有兴趣的同学可以自己查查)。IP协议是网络通信中的一个基础协议。每一个连上网(无论是局域网还是英特网)

    2024年02月08日
    浏览(48)
  • 【Netty专题】【网络编程】从OSI、TCP/IP网络模型开始到BIO、NIO(Netty前置知识)

    我是有点怕网络编程的,总有点【谈网色变】的感觉。为了让自己不再【谈网色变】,所以我想过系统学习一下,然后再做个笔记这样,加深一下理解。但是真要系统学习,其实还是要花费不少时间的,所以这里也只是简单的,尽可能地覆盖一下,梳理一些我认为比较迫切需

    2024年02月06日
    浏览(52)
  • 【网络原理】网络层 IP 协议

    ✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 网络层协议的工作: 地址管理 路由选择(规划路径) 网络层中,最核心的协议就是 IP 协议 协议头格式如下: 4 位版本号 : 当前 IP 协议的版本号,有 4 和 6 ,此文我们以 IPv4 为主! 4 位首部长度 : IP 报头的长度。 带有选项

    2024年02月07日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包