《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——5.某客户SVC后端负载不均

简介: 《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——5.某客户SVC后端负载不均

问题背景

客户反馈在使用ipvlan模式时,将nginx的upstream的唯一后端设置为clusterip的service,会出现负载不均的问题。

 

排查过程

当upstream与nginx不区分节点部署时,能够发现对于所有与nginx位于相同节点upstream,被动新建连接数量比不在相同节点上要小,并且相对稳定

image.png

 

增加两个副本,在不进行ct变动情况下压测,发现流量不均衡 image.png

 手动清理全部ct后,进行测试,可以发现流量趋于均衡

image.png

 

当压测过程中,对upstream所在deployment增加副本数,新增副本与已经有流量副本会有严重不均衡,经过数据面排查,ct表中数量有较大差异,lb表确认在副本调整后时间不久即完成endpoint扩充

image.png

 经过monitor抓取后发现新扩容副本和旧副本之间差别较大 

image.png

 

在monitor这对不同endpoint抓取后发现,固定nginx侧端口最终进入ct后端是一样,即如果某个端口五元组有到达某个固定upstreamct,则会一直保持分配到这个upstream,如下图: 

image.png

 初步怀疑是ct一致保持在cilium_ct4_global表中不会过期导致某个nginx端口持续会分配到固定upstream,查看ct表发现expires时间几乎保持不变,如下图:

image.png

 

根因原理

选取cilium_ct4_global表中某个键值查看,较长时间,月30s不会有过期,猜测与map的过期机制有关。

image.png

 在ciliumservicelb4_local代码逻辑中,如果能够从ct表中找到,无论是establish还是reopend,都会复用ct

image.png

cilium_ct4_global表是lru_hash类型的map: 

image.png

查询linux内核文档发现,lru_hash表的查找操作会让expires的时间重置,因此在流量较高的情况下,ct不会过期:

https://lore.kernel.org/all/d69d44ca-206c-d818-1177-c8f14d8be8d1@iogearbox.net/T/

 

lru_hashidle回收逻辑是每1s进行一次,1s内如果ct被访问过,则不会被删除并且一直复用,产生这个现象

 

关于删除时间,观察到经过10min左右的静默后,ct表中相关的数据已经过期,但是重新开始压测,发现依然存在负载不均衡的现象。分析cilium代码发现,选择后端时会通过hash的方式选择: 

/* The daddr is explicitly excluded from the hash here in order to allow for
* backend selection to choose the same backend even on different service VIPs.
*/
static __always_inline __u32 hash_from_tuple_v4(const struct ipv4_ct_tuple *tuple)
{
    return jhash_3words(tuple->saddr,
                        ((__u32)tuple->dport << 16) | tuple->sport,
                        tuple->nexthdr, HASH_INIT4_SEED);
}

 根据这段逻辑,即使ct被销毁,只要hash因子不变,一致性哈希还是会选到相同的节点,新加入的endpoint很难被选中,经过测试发现,在重建nginx的pod之后可以均衡,应该是哈希因子重建之后,恢复均匀。

 

查看代码发现

https://github.com/cilium/cilium/blob/master/bpf/lib/conntrack.h,对Service类型不会设置为Close,最终的超时时间为6小时

社区也有相关的issue:https://github.com/cilium/cilium/issues/18442

最终解决是在最新的这次提交中 https://github.com/cilium/cilium/pull/19451

提交的内容是,当Service的连接收到任何一方的fin/rst包后,在30s内如果不再有在这个连接上的包进来,那么下次命中同样conntrack的syn包会被走到CT_NEW的逻辑来重新选择后端

所以只要在这个修改的基础上,然后应用的端口复用的间隔>30s就能避免这个问题

 

修改已经cherry-pick到terwaypolicy中:

https://github.com/AliyunContainerService/terway/pull/365

 

解决办法

Terway 已经在1.2.4 版本中修复

https://help.aliyun.com/document_detail/113090.html

image.png

image.png

相关文章
|
11月前
|
人工智能 云栖大会 调度
「2025云栖大会」“简单易用的智能云网络,加速客户AI创新”专场分论坛诚邀莅临
”简单易用的智能云网络,加速客户AI创新“专场分论坛将于9月24日13:30-17:00在云栖小镇D1-5号馆举办,本场技术分论坛将发布多项云网络创新成果,深度揭秘支撑AI时代的超低时延、自适应调度与跨域协同核心技术。同时来自领先企业的技术先锋将首次公开其在模型训练、企业出海等高复杂场景中的突破性实践,展现如何通过下一代云网络实现算力效率跃升与成本重构,定义AI时代网络新范式。
326 4
|
人工智能 安全 Cloud Native
阿里云云原生安全能力全线升级,护航百万客户云上安全
【重磅发布】9月20日,在杭州云栖大会上,阿里云宣布云原生安全能力全线升级,首次发布云原生网络检测与响应产品NDR(Network Detection Response,简称NDR)。同时,阿里云还宣布将持续增加免费的安全防护能力,帮助中小企业客户以极低投入完成基础的云上安全风险治理。
615 15
|
算法 安全 大数据
【算法合规新时代】企业如何把握“清朗·网络平台算法典型问题治理”专项行动?
在数字化时代,算法推动社会发展,但也带来了信息茧房、大数据杀熟等问题。中央网信办发布《关于开展“清朗·网络平台算法典型问题治理”专项行动的通知》,针对六大算法问题进行整治,明确企业需落实算法安全主体责任,建立健全审核与管理制度,并对算法进行全面审查和备案。企业应积极自查自纠,确保算法合规透明,防范风险,迎接新机遇。
|
Kubernetes 监控 Cloud Native
全栈声明式可观测:KubeVela开箱即用且灵活定制的云原生应用洞察
KubeVela 是一个开箱即用的现代化应用交付与管理平台。本文我们将聚焦 KubeVela 的可观测体系,介绍云原生时代的可观测挑战及 KubeVela 的解决方案。
|
自然语言处理 监控 Cloud Native
对话阿里云云原生产品负责人李国强:推进可观测产品与OpenTelemetry开源生态全面融合
阿里云宣布多款可观测产品全面升级,其中,应用实时监控服务 ARMS 在业内率先推进了与 OpenTelemetry 开源生态的全面融合,极大丰富了可观测的数据类型及规模,大幅增强了 ARMS 核心能力。本次阿里云 ARMS 产品全面升级的背景是什么?为什么会产生围绕 OpenTelemetry 进行产品演进的核心策略?在云原生、大模型等新型应用架构类型层出不穷的今天,又将如何为企业解决新的挑战?阿里云云原生应用平台产品负责人李国强接受采访解答了这些疑问,点击本文走进全新升级的阿里云可观测产品。
42520 122
|
运维 容灾 API
云栖大会 | 阿里云网络持续演进之路:简单易用的智能云网络,让客户专注业务创新
云栖大会 | 阿里云网络持续演进之路:简单易用的智能云网络,让客户专注业务创新
1000 2
|
人工智能 运维 API
第七届 SD-WAN&SASE大会暨云网络大会 | 简单易用的智能云网络,让客户专注业务创新
第七届 SD-WAN&SASE大会暨云网络大会 | 简单易用的智能云网络,让客户专注业务创新
402 2
|
存储 监控 Cloud Native
kubevela可观测体系问题之KubeVela云原生时代可观测性挑战的问题如何解决
kubevela可观测体系问题之KubeVela云原生时代可观测性挑战的问题如何解决
221 7
|
弹性计算 运维 安全
面对蓝屏,阿里云云原生能力可以帮客户做点啥?
Windows大面积蓝屏,问题源于“CSAgent.sys”加载错误设定的“C-00000291*.sys”文件。阿里云充分利用云原生能力,通过ECS实例自助排查和OOS批量操作快速修复受损机器。

热门文章

最新文章