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中增加了如下环境变量

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

  2. 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秒延迟问题

  2. Kubernetes v1.17+ 集群下 CNI 使用 VXLAN 模式 SVC 有 63 秒延迟的触发原因定位 | 云原生社区(中国)

  3. k8s vxlan 作为 cni 后端引发的 63 秒延迟

  4. https://github.com/projectcalico/calico/issues/3145

  5. https://github.com/projectcalico/felix/pull/2811/files

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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
Kubernetes 应用服务中间件 Docker
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
|
22天前
|
容器 Perl Kubernetes
深入 Kubernetes 网络:实战K8s网络故障排查与诊断策略
本文介绍了Kubernetes网络的基础知识和故障排查经验,重点讨论了私有化环境中Kubernetes网络的挑战。首先,文章阐述了Kubernetes网络模型的三大核心要素:Pod网络、Service网络和CNI,并强调了其在容器通信和服务发现中的作用。接着,通过三个具体的故障案例,展示了网络冲突、主节点DNS配置更改导致的服务中断以及容器网络抖动问题的解决过程,强调了网络规划、配置管理和人员培训的重要性。最后,提到了KubeSkoop exporter工具在监控和定位网络抖动问题中的应用。通过这些案例,读者可以深入了解Kubernetes网络的复杂性,并学习到实用的故障排查方法。
146240 18
|
28天前
|
存储 监控 Kubernetes
Kubernetes 集群的监控与性能优化策略网络安全与信息安全:防范漏洞、加强加密、提升安全意识
【5月更文挑战第27天】 在微服务架构日益普及的背景下,容器编排工具如Kubernetes成为运维工作的核心。然而,随之而来的是监控复杂性增加和性能调优的挑战。本文将深入探讨针对Kubernetes集群的监控方案和性能优化技巧,旨在帮助读者构建一个高效、稳定的容器化环境。通过分析集群资源消耗模式,结合实时监控数据,本文提出了一系列实用的优化措施,以期提高系统响应速度,降低资源浪费,确保服务的高可用性。
|
23天前
|
Kubernetes 微服务 容器
Aspire项目发布到远程k8s集群
Aspire项目发布到远程k8s集群
376 2
Aspire项目发布到远程k8s集群
|
12天前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
192 3
|
3天前
|
Kubernetes 算法 API
K8S 集群认证管理
【6月更文挑战第22天】Kubernetes API Server通过REST API管理集群资源,关键在于客户端身份认证和授权。
|
14天前
|
Kubernetes 数据处理 调度
天呐!部署 Kubernetes 模式的 Havenask 集群太震撼了!
【6月更文挑战第11天】Kubernetes 与 Havenask 集群结合,打造高效智能的数据处理解决方案。Kubernetes 如指挥家精准调度资源,Havenask 快速响应查询,简化复杂任务,优化资源管理。通过搭建 Kubernetes 环境并配置 Havenask,实现高可扩展性和容错性,保障服务连续性。开发者因此能专注业务逻辑,享受自动化基础设施管理带来的便利。这项创新技术组合引领未来,开启数据处理新篇章。拥抱技术新时代!
|
14天前
|
Kubernetes 前端开发 Serverless
Serverless 应用引擎产品使用合集之如何调用Kubernetes集群内服务
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
24天前
|
运维 Kubernetes 调度
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
|
25天前
|
Kubernetes 微服务 容器
Aspire项目发布到win11本地k8s集群
Aspire项目发布到win11本地k8s集群
203 0
Aspire项目发布到win11本地k8s集群

热门文章

最新文章