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

相关文章
|
3天前
|
JSON 前端开发 API
打造高效后端:RESTful API 设计的最佳实践
【9月更文挑战第14天】在数字化时代,后端开发是构建强大、灵活和可维护应用程序的基石。本文将深入探讨如何设计高效的RESTful API,包括清晰的资源定义、合理的HTTP方法使用、URL结构规划、状态码的准确返回以及数据格式的设计。通过这些实践,开发者能够创建出既符合行业标准又易于维护和扩展的API,为前端提供强大的数据支持,确保整个应用的稳定性和性能。
137 74
|
1月前
|
JSON 安全 API
构建高效后端API:最佳实践与代码示例
【8月更文挑战第2天】 在数字化时代,后端API是连接数据与用户的桥梁。本文深入探讨了如何设计并实现高效的后端API,从理论到实践,提供了实用的技巧和代码示例。通过阅读本篇文章,你将学会如何避免常见的陷阱,优化你的API性能,从而提供更加流畅的用户体验。
|
1月前
|
缓存 前端开发 JavaScript
高效开发现代 Web 应用:从前端到后端的最佳实践
在开发现代 Web 应用时,前端和后端技术的选择对项目的性能、可维护性和用户体验至关重要。本文将探讨如何通过现代工具和框架来优化前端和后端开发流程。我们将分析前端技术(如 React 和 Vue.js)与后端技术(如 Node.js 和 Django)的集成,并提供实际案例来展示如何实现高效开发。无论是对新手还是经验丰富的开发者,本指南都提供了宝贵的洞见和实用的技巧,以帮助提高开发效率并构建出色的 Web 应用。
|
18天前
|
缓存 JavaScript API
构建高效的RESTful API:后端开发的最佳实践
【8月更文挑战第31天】在数字化时代,RESTful API成为连接不同软件组件的桥梁。本文将揭示如何打造一个既高效又易于维护的RESTful API,涵盖设计原则、代码实现及性能优化技巧。你将学习到如何运用最佳实践来提升API的响应速度和可扩展性,同时确保安全性和可靠性。
|
2月前
|
Kubernetes 负载均衡 API
构建高效后端服务:微服务架构的最佳实践
【7月更文挑战第30天】在现代软件开发中,微服务架构已成为设计可扩展、灵活和容错后端系统的首选方法。本文深入探讨了微服务架构的核心概念、设计原则以及实施过程中的关键技术选择。通过分析实际案例,我们揭示了成功部署微服务的最佳实践,包括服务划分、通信协议、数据一致性保障等关键方面,旨在为开发者提供一套实用的指南,以构建和维护高性能的后端服务。
40 4
|
2月前
|
存储 监控 Cloud Native
kubevela可观测体系问题之KubeVela云原生时代可观测性挑战的问题如何解决
kubevela可观测体系问题之KubeVela云原生时代可观测性挑战的问题如何解决
|
1月前
|
XML JSON 安全
构建高效API:后端开发最佳实践
【8月更文挑战第3天】在数字化时代,API(应用程序接口)成为连接不同软件和服务的关键桥梁。本文将深入探讨如何设计、实现和维护高效的API,确保它们既能够快速响应请求,又能保持足够的灵活性以应对未来的变化。我们将通过具体代码示例和实用建议,为后端开发人员提供一套完整的指南,帮助他们构建出高性能、易维护的API系统。文章将从API设计的基本原则出发,逐步深入到具体的实现技术,包括数据格式选择、错误处理策略以及安全性考虑等方面,旨在帮助读者掌握创建和管理高效API的关键技能。
|
3月前
|
弹性计算 监控 Cloud Native
构建多模态模型,生成主机观测指标,欢迎来战丨2024天池云原生编程挑战赛
本次比赛旨在如何通过分析 ECS 性能数据和任务信息,综合利用深度学习、序列分析等先进技术,生成特定机器的性能指标。参赛者的解决方案将为云资源管理和优化决策提供重要参考,助力云计算资源的高效稳定运行和智能化调度。
630 13
|
1月前
|
JavaScript 前端开发 中间件
打造卓越后端:构建高效API的最佳实践与实战代码示例——解锁高性能Web服务的秘密
【8月更文挑战第2天】构建高效后端API:最佳实践与代码示例
54 0
|
3月前
|
安全 API 网络架构
构建高效的RESTful API:后端开发的最佳实践
【6月更文挑战第14天】在数字化时代,RESTful API是连接不同软件系统和促进数据交换的关键。本文将深入探讨如何设计、实现和维护一个高效、可扩展且安全的RESTful API,确保后端服务的响应性、可靠性和安全性。

热门文章

最新文章