《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——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

相关文章
|
2月前
|
人工智能 安全 Cloud Native
阿里云云原生安全能力全线升级,护航百万客户云上安全
【重磅发布】9月20日,在杭州云栖大会上,阿里云宣布云原生安全能力全线升级,首次发布云原生网络检测与响应产品NDR(Network Detection Response,简称NDR)。同时,阿里云还宣布将持续增加免费的安全防护能力,帮助中小企业客户以极低投入完成基础的云上安全风险治理。
170 15
|
2月前
|
缓存 监控 安全
构建高效后端系统的最佳实践
本文将深入探讨如何构建一个高效的后端系统,从设计原则、架构选择到性能优化等方面详细阐述。我们将结合实际案例和理论分析,帮助读者了解在构建后端系统时需要注意的关键点,并提供一些实用的建议和技巧。
42 2
|
1月前
|
JavaScript API 微服务
探索现代后端开发:关键技术和最佳实践
【10月更文挑战第6天】探索现代后端开发:关键技术和最佳实践
|
2月前
|
JSON 前端开发 API
打造高效后端:RESTful API 设计的最佳实践
【9月更文挑战第14天】在数字化时代,后端开发是构建强大、灵活和可维护应用程序的基石。本文将深入探讨如何设计高效的RESTful API,包括清晰的资源定义、合理的HTTP方法使用、URL结构规划、状态码的准确返回以及数据格式的设计。通过这些实践,开发者能够创建出既符合行业标准又易于维护和扩展的API,为前端提供强大的数据支持,确保整个应用的稳定性和性能。
167 74
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
揭秘深度学习中的微调难题:如何运用弹性权重巩固(EWC)策略巧妙应对灾难性遗忘,附带实战代码详解助你轻松掌握技巧
【10月更文挑战第1天】深度学习中,模型微调虽能提升性能,但常导致“灾难性遗忘”,即模型在新任务上训练后遗忘旧知识。本文介绍弹性权重巩固(EWC)方法,通过在损失函数中加入正则项来惩罚对重要参数的更改,从而缓解此问题。提供了一个基于PyTorch的实现示例,展示如何在训练过程中引入EWC损失,适用于终身学习和在线学习等场景。
61 4
揭秘深度学习中的微调难题:如何运用弹性权重巩固(EWC)策略巧妙应对灾难性遗忘,附带实战代码详解助你轻松掌握技巧
|
23天前
|
监控 安全 Java
构建高效后端服务:微服务架构深度解析与最佳实践###
【10月更文挑战第19天】 在数字化转型加速的今天,企业对后端服务的响应速度、可扩展性和灵活性提出了更高要求。本文探讨了微服务架构作为解决方案,通过分析传统单体架构面临的挑战,深入剖析微服务的核心优势、关键组件及设计原则。我们将从实际案例入手,揭示成功实施微服务的策略与常见陷阱,为开发者和企业提供可操作的指导建议。本文目的是帮助读者理解如何利用微服务架构提升后端服务的整体效能,实现业务快速迭代与创新。 ###
57 2
|
1月前
|
存储 缓存 API
构建高效后端:RESTful API 设计的最佳实践
【10月更文挑战第2天】在数字化时代,后端开发是连接用户与数据的桥梁。本文将深入探讨如何设计一个高效、易于维护的后端系统,特别是围绕RESTful API的设计原则和最佳实践。我们将从基础概念出发,逐步深入到实际案例分析,最终通过代码示例具体展示如何实现这些设计原则。无论你是初学者还是有经验的开发者,这篇文章都将为你提供价值,帮助你构建更优秀的后端服务。
61 10
|
1月前
|
监控 Cloud Native 数据库
云原生后端
云原生后端是当今软件开发领域的一个重要概念,它代表了将软件应用程序容器化部署在云环境中,并采用微服务架构进行开发和管理的一种趋势。这种趋势的兴起,得益于云计算和微服务架构的快速发展,以及企业对高效、灵活、可扩展的应用程序架构的迫切需求。
31 2
|
1月前
|
安全 测试技术 API
后端开发中的API设计原则与最佳实践
本文将深入探讨在后端开发中API(应用程序编程接口)设计的基本原则和最佳实践。通过阐述如何构建高效、可扩展且安全的API,帮助开发者提升后端系统的性能和用户体验。不同于传统的摘要,本文无需包含背景介绍,直接进入主题,为读者提供实用的指导。
57 7
|
3月前
|
JSON 安全 API
构建高效后端API:最佳实践与代码示例
【8月更文挑战第2天】 在数字化时代,后端API是连接数据与用户的桥梁。本文深入探讨了如何设计并实现高效的后端API,从理论到实践,提供了实用的技巧和代码示例。通过阅读本篇文章,你将学会如何避免常见的陷阱,优化你的API性能,从而提供更加流畅的用户体验。

热门文章

最新文章