V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
easterfan
V2EX  ›  云计算

冒死分析:不能访问自己的 SLB 是一个坏设计

  •  
  •   easterfan · 2023-10-26 09:57:56 +08:00 · 2575 次点击
    这是一个创建于 389 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前在做的专有云领域,一个基于 k8s 的容器云迁云项目, 部署 k8s 底座集群时,需要使用某专有云厂商提供的 slb 产品, 不小心踩到的坑,写了一篇博客记录; 但是对 slb 产品了解不深,观点可能有失偏颇

    所以发到 v2 上,给大佬们批评指正

    原文地址(博客托管在 github pages 上,加载可能很慢,请见谅):👇🏻

    冒死分析:不能访问自己的 SLB 是一个坏设计

    17 条回复    2023-10-27 13:52:55 +08:00
    Alliot
        1
    Alliot  
       2023-10-26 10:16:43 +08:00
    感谢分享, 有个与原文的问题: 博客这篇文章的布局有点奇怪,阅读起来字体和图很小,cmd++了几次才够看清😂

    另外就是集群自发的请求到自身集群在设计的时候为什么不是一开始就走内部 svc 呢?这是出于什么考虑
    Reficul
        2
    Reficul  
       2023-10-26 10:20:50 +08:00   ❤️ 1
    这个好像是 lvs snat 转发模式的限制
    perfectlife
        3
    perfectlife  
       2023-10-26 10:24:08 +08:00
    确实遇到过这个问题,还是挺恶心的,但是嘛只能忍了
    ttvast
        4
    ttvast  
       2023-10-26 10:28:57 +08:00
    不同的技术方案有不同的优缺点。
    LVS 就是有很多优势,自然也有这样的缺点。你完全可以调整业务逻辑,让 RIP 服务器不要访问自己的 VIP 。
    cyaki
        5
    cyaki  
       2023-10-26 10:32:04 +08:00
    记得 AWS 的可以访问自己
    opengps
        6
    opengps  
       2023-10-26 10:34:56 +08:00
    slb 的出发点就是内网集群提高负载,所以这个产品从一出来就不能配置连接外边的节点加入集群
    FabricPath
        7
    FabricPath  
       2023-10-26 10:40:22 +08:00
    为什么不能访问自己? 你注意观察一下你 RS 收到的报文,源 IP 是不是就是你真正的 IP ,L4LB 并没有给你做 SNAT ;
    那问题来了,如果你自己访问自己,10.0.10.1 访问 VIP 172.16.0.1 ,RS 是 10.0.10.1 ,那你收到的报文是什么样子的?
    是 10.0.10.1 -> 10.0.10.1 ,那么你回的报文在本地就终结了,不会回到 L4LB ,所以就不通了。

    为什么 L7 的可以?因为 L7 是用户态代理,通过 TOA 或者 Header 的方式传递真正的 ClientIP ,Upstream 收到的报文的 SrcIP 是 L7LB 实例的 IP 。

    为什么有的 L4LB 可以?因为 L4LB 分好几种模式,FULLNAT 模式的可以,但是 FULLNAT 一般是低端技术的代名词,限制非常多。
    FabricPath
        8
    FabricPath  
       2023-10-26 10:45:18 +08:00
    L4LB 一般都是做公网接入,IN-CLUSTER LB 方案太多,一般也不会去买云上 LB 实例,所以说到底,还是这个场景需求太小(小到忽略不计,基本没见过这么用的),但是对 L4LB 的稳定性、扩展性、性能都是个巨大挑战,并且还会有”怎么看到真实的 ClientIP“的问题,不能告诉用户”你要在你机器上装一个 TOA 模块“吧。
    rrfeng
        9
    rrfeng  
       2023-10-26 10:48:32 +08:00
    这又不是设计出来的……
    isno
        10
    isno  
       2023-10-26 13:36:51 +08:00
    这几天正在写这方面的内容,https://www.thebyte.com.cn/balance/balance4-net.html 略微说几句。

    @FabricPath 的回复说明了原因,L4LB 的定位做公网集群入口的。

    我不知道你们为何要 RS 访问 DS ,但武断地说一句:集群内部机器再通过公网入口访问内部服务,这才是一个坏的设计。
    dropdatabase
        11
    dropdatabase  
       2023-10-26 15:27:06 +08:00
    这个问题很多年了。自建 k8s 时遇到过,最后 apiserver 换成了公网 SLB.....
    devopsdogdog
        12
    devopsdogdog  
       2023-10-26 15:30:32 +08:00
    集群内部 肯定是走内网吧,只能说你有需求,或者是场景限制,算不上坏。
    easterfan
        13
    easterfan  
    OP
       2023-10-26 19:27:51 +08:00
    @Alliot
    博客是直接从本地导出 html ,样式比较极简😂

    一开始没用 svc ,主要是考虑到有环路依赖,kubelet apiserver 依赖 ipvs ipvs 依赖 kubeproxy 写入规则 kubeproxy pod 的存活依赖 kubelet ,如果 kubeproxy 挂了规则被刷新了,会有死锁问题~
    easterfan
        14
    easterfan  
    OP
       2023-10-26 19:31:36 +08:00
    @cyaki 感谢提醒,过两天试试 aws
    fairytale
        15
    fairytale  
       2023-10-26 21:53:04 +08:00 via Android
    家用路由器也是,好像要搞什么端口回流。
    Reficul
        16
    Reficul  
       2023-10-27 11:17:24 +08:00
    我记得 lvs 的这个限制可以通过某个内核参数控制,但是可能会存在安全问题。 另外,FULLNAT 模式也可以解决,但是代价是可能看不到真实的 sip 。
    CheckMySoul
        17
    CheckMySoul  
       2023-10-27 13:52:55 +08:00
    阿里云不是有内网负载均衡吗,试试那个呢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4230 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 05:28 · PVG 13:28 · LAX 21:28 · JFK 00:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.