Kubernetes网络问题排查分享两则(1)——calico特定场景下的网络性能问题

简介: 在对Kubernetes项目[kosmos](https://github.com/kosmos-io/kosmos)与Calico网络性能进行对比测试时,发现kosmos在跨集群容器网络的性能显著优于Calico的集群内网络(约6Gbit/s对比2.9Gbit/s)。物理机网络测试达到9.38Gbit/s,显示Calico有68%的性能损耗。问题定位到网卡的checksum/offload参数,尝试用`ethtool`调整后虽短暂提升,但随后恢复原状。转载自:https://mp.weixin.qq.com/s/XsQZCSqZAXJK46zqc7IpLw

问题一:calico特定场景下的网络性能问题

**问题现象** 最近我们在做kosmos的性能测试,本来是想做一个简单的对比,说明我们kosmos搭建的vxlan网络和calico的集群内的容器网络性能差不多在同一水平,但是测试下来,我们发现kosmos在连通跨集群的容器网络时,表现竟然远远好于calico的集群内容器网络,这令我们非常困惑。 我们先看下集群内的calico容器网络,iperf3 server端启动在一个节点的容器内,iperf3 client端启动在另一个节点的容器内,测试后发现,传输速度大约只有2.9Gbit/s,如下图所示

image.png
calico集群内容器网络传输-优化前

再看下kosmos跨容器网络传输速度大概是6Gbit/s,如下图所示

image.png
kosmos跨集群网路网络测试

此时,我们测试物理机本身的网络,iperf3 client端访问物理网卡即可,测试结果大致为9.38Gbit/s,如下图所示

image.png
物理机网络传输测

可以看到物理机性的网络传输性能远高于calico容器网络,68% 的性能损耗几乎无法接受

**问题的定位** 因为现象是kosmos的跨集群网络比calico的容器网络性能好,我们主要的精力都花在了对比测试上。 排查过程中,我们找了一些工具来检查环境中的流量,但是没有明显看到其他进程挤占流量,值得注意的是,我们使用iptraf-ng命令观察网卡流量的时候,发现每次一启动程序iperf测试的带宽就会迅速下降,不清楚这个工具的具体机制,为什么会影响到网络带宽性能,这也给我们提了个醒,在线上排查问题的时候选择工具也要考虑对环境的影响。 经过对比vxlan网卡的配置,如sysctl -a查询网卡相关的系统参数,对比ip linkx show devname中的配置项,以及ethool查询网卡配置,最终我们发现问题出在网卡的checksum/offload参数上。 现在我们手动执行命令**ethtool -K vxlan.calico tx on**修改参数进行测试,如下图所示

image.png
ethtool调整参数

发现一开始修改后传输性能提升了很多,但是后续却迅速下降到了未修改前的情况

image.png
ethtool调整参数后测试

再次查看参数,发现参数又被calico修改回去了,他不想让我们修改!

image.png
再次检查参数

经过资料检索,我们在 calico-node 这个daemonset中增加了如下环境变量 ```js name: FELIX_FEATUREDETECTOVERRIDE value: ChecksumOffloadBroken=false ``` 效果如下所示:

image.png
修改calico-node配置

等calico-node重启,在所有主机上修改参数进行测试,效果如下所示 结果如下所示

image.png

性能和Kosmos差不多,这大概符合我们的预期。

**进一步讨论:calico为何要锁定这个参数?** 大概是因为存在一个checksum相关的bug,可能和内核版本以及k8s版本相关,猜测因此在低内核版本下,calico默认关掉了这个配置项 > 内核中存在一个和VXLAN处理有关的缺陷,该缺陷会导致Checksum Offloading不能正确完成。这个缺陷仅仅在很边缘的场景下才会表现出来。 > 在VXLAN的UDP头被NAT过的前提下,如果: > 1. VXLAN设备禁用(这是RFC的建议)了UDP Checksum > 1. VXLAN设备启用了Tx Checksum Offloading > 就会导致生成错误的UDP Checksum。 > 从资料[1]看,K8S的v1.18.5版本已经修复了这个问题,但我的问题是在v1.21.0上发现的,所以不确定只升级K8S是否可以解决该问题,或者升级后还需要额外配置什么? > 从资料[3]和[4]看,calico在v3.20.0版本做了修改:在kernels < v5.7时也禁用了calico.vxlan接口的Offloading功能。 > 1. 绿色记忆:内核缺陷触发的NodePort服务63秒延迟问题 > 1. Kubernetes v1.17+ 集群下 CNI 使用 VXLAN 模式 SVC 有 63 秒延迟的触发原因定位 | 云原生社区(中国) > 1. k8s vxlan 作为 cni 后端引发的 63 秒延迟 > 1. https://github.com/projectcalico/calico/issues/3145 > 1. https://github.com/projectcalico/felix/pull/2811/files > 1. K8S问题排查-Calico的Vxlan模式下节点发起K8s Service请求延迟 | 云原生知识星球 我个人在生产环境中也遇到了一个网络问题,怀疑也是checksum的问题,当时的现象是ping测试网络不通,且收到的包有checkum error之类的报错,但是curl测试tcp协议的包可以正常传输,不过因为是现网环境,没有修改参数测试。 checksum和offload是关联的配置项,真正影响我们测试性能的应该是offload这个配置 找了一点资料简单介绍下: > TSO就是将TCP Segmentation的工作,卸载(offload)到网卡来完成。有了TSO,操作系统只需要传给硬件网卡一个大的TCP数据(当然是包在Ethernet Header和IP Header内,且不超过64K)。网卡会代替TCP/IP协议栈完成TCP Segmentation。这样,就消除了TCP Segmentation带来的CPU负担。 > 另一个好处在DMA。虽然说每次DMA操作,不需要CPU太多的介入,但是仍然需要CPU配置DMA控制器。DMA的特点在于,无论传输数据的长短,配置工作量是一样的。如果系统内核自己完成TCP Segmentation,那么就有若干个TCP Segments需要通过DMA传给网卡。而采用TSO,因为传输的是一大段数据,只需要配置一次DMA,就可以将数据拷贝到网卡。这也一定程度减轻了CPU的负担。 > 支持TSO的网卡,仍然会按照TCP/IP协议将网络数据包生成好并发送出去。对于外界系统来说,感受不到TSO的存在。 > https://zhuanlan.zhihu.com/p/44635205 > https://klysisle.space/archives/3b5f401c.html

总结 我们是在性能测试中遇到的这个问题,是由于为了对比测试性能,我们特意把calico的网络模式调整成了vxlanMode: Always,我们的内核版本是4.19,kubernetes版本是v1.21.5,calico的版本是v3.23.2。我们生产环境中的配置应该是vxlanMode: CrossSubnet,也就是说只有在跨网段且使用vxlan网络模式的情况下才有可能出现这种性能瓶颈,同网段不会存在问题。 另外经过前面的讨论,我们也能看到,开启了checksum相关的特性,在某些场景下会引起一些诡异的网络问题,我们应该要针对特定场景做充分的测试才能修改系统参数。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
13天前
|
存储 消息中间件 弹性计算
阿里云服务器ECS计算型c7和通用算力型u1在适用场景、计算性能、网络与存储性能等方面的对比
阿里云ECS服务器u1和c7实例在适用场景、性能、处理器特性等方面存在显著差异。u1为通用算力型,性价比高,适合中小企业及对性能要求不高的场景;c7为企业级计算型,采用最新Intel处理器,性能稳定且强大,适用于高性能计算需求。u1支持多种CPU内存配比,但性能一致性可能受底层平台影响;c7固定调度模式,确保高性能与稳定性。选择时可根据预算与性能需求决定。
71 23
|
23天前
|
人工智能 运维 监控
阿里云携手神州灵云打造云内网络性能监测标杆 斩获中国信通院高质量数字化转型十大案例——金保信“云内网络可观测”方案树立云原生运维新范式
2025年,金保信社保卡有限公司联合阿里云与神州灵云申报的《云内网络性能可观测解决方案》入选高质量数字化转型典型案例。该方案基于阿里云飞天企业版,融合云原生引流技术和流量“染色”专利,解决云内运维难题,实现主动预警和精准观测,将故障排查时间从数小时缩短至15分钟,助力企业降本增效,形成可跨行业复制的数字化转型方法论。
|
1月前
|
传感器 存储 算法
基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真
本程序基于ECC(椭圆曲线密码学)簇内分组密钥管理算法,对无线传感器网络(WSN)进行MATLAB性能仿真。通过对比网络通信开销、存活节点数量、网络能耗及数据通信量四个关键指标,验证算法的高效性和安全性。程序在MATLAB 2022A版本下运行,结果无水印展示。算法通过将WSN划分为多个簇,利用ECC生成和分发密钥,降低计算与通信成本,适用于资源受限的传感器网络场景,确保数据保密性和完整性。
|
5月前
|
数据采集 网络协议 JavaScript
网络爬虫性能提升:requests.Session的会话持久化策略
网络爬虫性能提升:requests.Session的会话持久化策略
|
5月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
167 2
|
5月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
507 7
|
5月前
|
域名解析 运维 网络协议
网络诊断指南:网络故障排查步骤与技巧
网络诊断指南:网络故障排查步骤与技巧
1293 7
|
7月前
|
机器学习/深度学习
YOLOv10优改系列一:YOLOv10融合C2f_Ghost网络,让YoloV10实现性能的均衡
本文介绍了YOLOv10的性能优化,通过融合Ghost模块和C2f结构,实现了网络性能的均衡。GhostNet通过GhostModule和GhostBottleNeck减少参数量,适用于资源有限的场景。YOLOv10-C2f_Ghost在减少参数和计算量的同时,保持了与原始网络相当或更好的性能。文章还提供了详细的代码修改步骤和可能遇到的问题解决方案。
865 1
YOLOv10优改系列一:YOLOv10融合C2f_Ghost网络,让YoloV10实现性能的均衡
|
6月前
|
网络协议 Linux
使用nmcli命令设置IP地址并排查网络故障
nmcli 是一个功能强大的网络管理工具,通过它可以轻松配置IP地址、网关和DNS,同时也能快速排查网络故障。通过正确使用nmcli命令,可以确保网络配置的准确性和稳定性,提高系统管理的效率。希望本文提供的详细步骤和示例能够帮助您更好地掌握nmcli的使用方法,并有效解决实际工作中的网络问题。
474 2
|
7月前
|
缓存 监控 前端开发
优化网络应用的性能
【10月更文挑战第21天】优化网络应用的性能
79 2