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相关的特性,在某些场景下会引起一些诡异的网络问题,我们应该要针对特定场景做充分的测试才能修改系统参数。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
7月前
|
人工智能 运维 安全
从被动防御到主动免疫进化!迈格网络 “天机” AI 安全防护平台,助推全端防护性能提升
迈格网络推出“天机”新版本,以AI自学习、全端防护、主动安全三大核心能力,重构网络安全防线。融合AI引擎与DeepSeek-R1模型,实现威胁预测、零日防御、自动化响应,覆盖Web、APP、小程序全场景,助力企业从被动防御迈向主动免疫,护航数字化转型。
从被动防御到主动免疫进化!迈格网络 “天机” AI 安全防护平台,助推全端防护性能提升
|
6月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
307 4
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
11月前
|
存储 消息中间件 弹性计算
阿里云服务器ECS计算型c7和通用算力型u1在适用场景、计算性能、网络与存储性能等方面的对比
阿里云ECS服务器u1和c7实例在适用场景、性能、处理器特性等方面存在显著差异。u1为通用算力型,性价比高,适合中小企业及对性能要求不高的场景;c7为企业级计算型,采用最新Intel处理器,性能稳定且强大,适用于高性能计算需求。u1支持多种CPU内存配比,但性能一致性可能受底层平台影响;c7固定调度模式,确保高性能与稳定性。选择时可根据预算与性能需求决定。
492 23
|
10月前
|
机器学习/深度学习 数据采集 监控
基于CNN卷积神经网络和GEI步态能量提取的步态识别算法matlab仿真,对比不同角度下的步态识别性能
本项目基于CNN卷积神经网络与GEI步态能量提取技术,实现高效步态识别。算法使用不同角度(0°、45°、90°)的步态数据库进行训练与测试,评估模型在多角度下的识别性能。核心流程包括步态图像采集、GEI特征提取、数据预处理及CNN模型训练与评估。通过ReLU等激活函数引入非线性,提升模型表达能力。项目代码兼容Matlab2022a/2024b,提供完整中文注释与操作视频,助力研究与应用开发。
|
传感器 存储 算法
基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真
本程序基于ECC(椭圆曲线密码学)簇内分组密钥管理算法,对无线传感器网络(WSN)进行MATLAB性能仿真。通过对比网络通信开销、存活节点数量、网络能耗及数据通信量四个关键指标,验证算法的高效性和安全性。程序在MATLAB 2022A版本下运行,结果无水印展示。算法通过将WSN划分为多个簇,利用ECC生成和分发密钥,降低计算与通信成本,适用于资源受限的传感器网络场景,确保数据保密性和完整性。
|
安全 自动驾驶 物联网
新四化驱动,如何构建智能汽车的“全场景”可进化互联网络?
在智能化、电动化、网联化、共享化的时代浪潮中,汽车正从单纯的 “机械产品” 进化为先进的 “移动智能终端”。在软件定义汽车(SDV)的崭新时代,每一次 OTA 升级的顺利完成、每一秒自动驾驶的精准决策、每一帧车载娱乐交互的流畅呈现,都离不开一张实时响应、全域覆盖、安全可靠的广域网络。
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
481 12
|
监控 算法 安全
公司电脑网络监控场景下 Python 广度优先搜索算法的深度剖析
在数字化办公时代,公司电脑网络监控至关重要。广度优先搜索(BFS)算法在构建网络拓扑、检测安全威胁和优化资源分配方面发挥重要作用。通过Python代码示例展示其应用流程,助力企业提升网络安全与效率。未来,更多创新算法将融入该领域,保障企业数字化发展。
286 10
|
数据采集 网络协议 JavaScript
网络爬虫性能提升:requests.Session的会话持久化策略
网络爬虫性能提升:requests.Session的会话持久化策略

推荐镜像

更多
下一篇
开通oss服务