cover

Kubernetes CNI网络插件性能瓶颈排查与优化实践

CNI(Container Network Interface)是 Kubernetes 网络层的核心组件,不同 CNI 插件实现了容器间网络通信、多租户隔离、流量限速等功能。然而在大规模集群或高并发业务场景下,CNI 插件性能瓶颈往往成为网络吞吐和容器部署速度的制约因素。本文结合真实生产环境案例,系统化地介绍了 CNI 插件的性能问题现象、定位思路、根因分析与解决方案,以及后续优化和预防监控措施。


一、问题现象描述

在一套千节点规模的 Kubernetes 集群中,采用 Calico CNI 插件,主要表现为:

  • 节点网络连通性偶发性中断,Pod 间流量丢包率在高并发场景下(>5000 QPS)上升到 5% 以上;
  • 新增节点或快速滚动部署时,CNI 相关的 calico-node DaemonSet 启动缓慢,插入 iptables 规则耗时 5-10s,导致 Pod 调度延迟严重;
  • 节点上 felix 进程 CPU 占用长期保持在 80% 以上,网络丢包增多。

业务方反馈业务峰值出现超时异常,排查后发现是网络层性能瓶颈导致微服务调用链等待。

二、问题定位过程

定位 CNI 插件性能瓶颈,一般可从以下几个维度进行排查:

  1. 观察节点网络状态指标
    • sar -n DEV 1 10 查看网卡流量和错误报文;
    • ss -snetstat -s 查看系统网络连接统计。
  2. 查看 CNI 插件日志
    • kubectl logs ds/calico-node -n kube-system,重点关注启动日志、felix 报错。
  3. 排查 iptables 规则数量
    • iptables-save | wc -l,若规则行数达到数千上万,匹配效率极低。
  4. 监控 felix CPU 使用率
    • 通过 Prometheus 抓取 container_cpu_usage_seconds_total;
  5. 抓取 netfilter trace
    • 使用 tcpdump 配合 iptables TRACE

2.1 网卡错误与包丢失分析

# 采集网卡流量和错误报文
sar -n DEV 1 5
time          IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s  txcmp/s   rxmcst/s    %ifutil
12:00:01      eth0     3000.00   2950.50   4000.00    3800.00      0.00     0.00       0.00      1.00errors: 0  dropped: 0

网卡本身无错误丢包,说明底层物理网络性能正常。

2.2 iptables 规则规模检查

# 查看节点上的 iptables 规则总数
iptables-save | wc -l
# 结果: 24500

近 2.5 万条规则,每次网络包过来的时候都需要做规则匹配,开销显著。

2.3 felix 日志与 CPU 报表

# 查看 felix 日志
kubectl logs -f ds/calico-node -n kube-system | grep felix
# CPU 使用率
# 在 Prometheus 中查询:sum(rate(container_cpu_usage_seconds_total{container="felix",pod=~"calico-node.*"}[5m])) by (instance)

felix 进程负责管理 BPF or iptables 规则,规则变更和网络事件响应过于频繁导致高 CPU。

三、根因分析与解决

通过上述定位,主要根因为:

  1. 使用 iptables 模式,规则条数过多;
  2. felix 默认全局扫描规则更新策略,不具备增量优化;
  3. 大规模集群场景下,CNI Controller 与节点同步延迟,频繁重刷规则。

针对这些根因,可采取以下优化:

3.1 切换 Calico BPF 数据平面

Calico 自 v3.17+ 开始支持 BPF dataplane,在 Linux 5.8+ 环境下可替换 iptables,性能提升显著。

  • 编辑 calico-node DaemonSet:
apiVersion: apps/v1
kind: DaemonSet
metadata:name: calico-nodenamespace: kube-system
spec:template:metadata:labels:k8s-app: calico-nodespec:containers:- name: calico-nodeenv:- name: FELIX_BPFENABLEDvalue: "true"- name: FELIX_BPFKERNELCOLLECTIONMODEvalue: "Disable" # 或 'Fallback'
  • 重启 DaemonSet 生效:
kubectl rollout restart ds/calico-node -n kube-system

BPF 模式下,网络包由 eBPF 程序直接处理,无需 iptables 多级查表,散列算法加速匹配。

3.2 优化 felix 配置

felixConfiguration CRD 中开启增量编程和减少全局扫描:

apiVersion: projectcalico.org/v3
kind: FelixConfiguration
metadata:name: default
spec:endpointRoutesEnabled: false  # 关闭 Endpoint 路由interfacePrefix: "cali"     # 只匹配 cali* 接口iptablesRefreshInterval: 600s # 延长规则刷新周期ipsetsRefreshInterval: 600s   # 延长 ipset 刷新周期

修改后:

kubectl apply -f felix-config.yaml

重启 calico-node 后,felix 仅增量更新规则,减少资源消耗。

四、优化改进措施

结合 BPF 模式和 felix 配置优化后,在相同流量模型下:

  • iptables-save | wc -l 规则行数减少至 3k;
  • felix CPU 使用率从 80% 降至 15%;
  • Pod 新增部署延迟从 5-10s 降至 500ms;
  • 网络丢包率降至 <0.1%。

4.1 容器网络资源隔离

为防止单节点网络资源争抢,可结合 Kubernetes NetworkPolicy:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: restrict-namespacenamespace: production
spec:podSelector: {}ingress:- from:- namespaceSelector:matchLabels:name: trustedpolicyTypes:- Ingress

通过合理的 NetworkPolicy 限流,减少 CNI 规则复杂度。

4.2 弹性扩缩容方案

配合 Kubernetes Cluster Autoscaler 或自研动态扩容脚本,当网络利用率达到阈值时,自动扩充节点,均摊流量压力。

五、预防措施与监控

  1. Prometheus 指标监控
    • felix_active_rule_count:规则总数
    • calico_bpf_programs_loaded:BPF 程序加载状态
    • calico_felix_cpu_seconds_total:CPU 使用情况
  2. Grafana 可视化告警
    • 规则数量 > 5k 报警
    • felix CPU > 50% 报警
    • Pod 网络错误 > 1% 报警
  3. 定期审计 CNI 插件版本
    • 保持 Calico、Cilium 等插件版本更新,及时获取性能改进
  4. 文档与 SOP
    • 制定 CNI 插件升级、配置变更的审批流程
    • 形成网络故障应急诊断手册

通过上述实践,在生产环境中成功稳定运行 24x7,支持每日峰值流量 10 万 QPS。希望本文对面临 Kubernetes CNI 网络性能挑战的同学有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89835.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89835.shtml
英文地址,请注明出处:http://en.pswp.cn/web/89835.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20250720-6-Kubernetes 调度-nodeName字段,DaemonS_笔记

一、污点与容忍&#xfeff;1. 给节点添加污点&#xfeff;1&#xff09;命令格式基本语法&#xff1a;kubectl taint node [node] keyvalue:[effect]示例&#xff1a;kubectl taint node k8s-node1 gpuyes:NoSchedule操作说明&#xff1a;与打标签命令类似&#xff0c;将"…

微软开源项目 Detours 详细介绍与使用实例分享

目录 1、Detours概述 2、Detours功能特性 3、Detours工作原理 4、Detours应用场景 5、Detours兼容性 6、Detours具体使用方法 7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截 C++软件异常排查从入门到精通系列教程…

研发知识系统选型实战:从 Notion 到 Gitee Wiki 的迭代经验

关键词&#xff1a;知识管理、版本控制、协作编辑、国产平台、研发效能 在日常研发管理中&#xff0c;知识管理平台往往被视为“非核心工具”&#xff0c;但它的好坏直接影响着团队交接效率、文档可用性以及协作深度。过去几年&#xff0c;我们团队先后使用过 Notion、Confluen…

从一开始的网络攻防(三):sqlmap快速上手

一、确定目标 使用sqlmap的第一步是确定探测的目标&#xff0c;一般有四种&#xff1a; 数据库URL文件Google批量扫 环境 Target IP: 192.168.8.133 Port: 13306(Mysql)、8088(sqli_labs) mysql&#xff1a; docker pull的最新mysql sqlmap github&#xff1a;https://g…

《Anaconda 精简路径治理》系列 · 番外篇Conda 虚拟环境路径结构方案全解——六种路径布局对比、优劣与治理建议

Python 多版本环境治理理念驱动的系统架构设计&#xff1a;三维治理、四级隔离、五项自治 原则-CSDN博客 Anaconda 路径精简后暴露 python 及工具到环境变量的配置记录-CSDN博客 【终极实战】Conda/Poetry/Virtualenv/Pipenv/Hatch 多工具协同 AnacondaPyCharm&#xff1a;构建…

容器基础知识3-kubectl、kubeadm 和 kubelet,kube-proxy

kubectl、kubeadm 和 kubelet&#xff0c;kube-proxy的概念和关系一、kubeadm&#xff1a;K8s 集群的 “搭建工程师”核心定位如果把 K8s 集群比作一栋大楼&#xff0c;kubeadm 就是负责 “打地基、搭框架” 的工程师&#xff0c;专门用来快速搭建 K8s 集群的工具。具体工作内容…

langchain调用本地ollama语言模型和嵌入模型

参考&#xff1a;ollama兼容OpenAIEmbeddings的解决思路 解决代码&#xff1a; 访问embedding模型代码 # 测试以下两个引用都可以 from langchain_openai import OpenAIEmbeddings #from langchain_community.embeddings import OpenAIEmbeddings from typing import List,…

gitlab私有化部署

以下是整理好的Markdown格式文档&#xff0c;详细描述了从下载镜像、启动镜像、修改external_url以及设置或重置root密码的步骤。 GitLab 安装与配置指南 本文档将指导您完成GitLab的安装和基本配置过程&#xff0c;包括下载镜像、启动容器、修改外部访问URL(external_url)及设…

CCLink IE转ModbusTCP网关配置无纸记录器(上篇)

本研究案例采用CCLink IE转ModbusTCP网关技术&#xff0c;实现了将记录仪数据传输至三菱PLCPLC的过程。具体操作步骤如下所述。在确保无纸记录仪与PT100传感器传感器的连接无误后&#xff0c;应将无纸记录仪与个人计算机&#xff08;PC&#xff09;通过以太网线进行连接&#x…

近期工作感想:职业规划篇

最近整理博客时&#xff0c;撞见意外的惊喜——17年刚毕业那会儿写的职业规划&#xff0c;静静躺在回收站里。 重读那些碎碎念&#xff0c;忍不住想笑&#xff1a;那时候的焦虑太真切了&#xff0c;哪敢想后来会遇到这么多大佬&#xff0c;推着我往前一直阴暗爬行&#x1f602;…

Matlab自学笔记六十四:求解自变量带有约束条件的方程

1.说明 有一些方程由于实际问题的需要&#xff0c;需要设置一些限制约束条件&#xff0c;例如x>0等&#xff0c;若使用Matlab编程求解&#xff0c;首先尝试使用符号运算求解&#xff08;符号运算可参考文章54&#xff1a;Matlab自学笔记五十四&#xff1a;符号数学工具箱和…

Flutter状态管理篇之ChangeNotifier(二)

目录 前言 一、ChangeNotifier定义 1.ChangeNotifier定义 2.Listenable的定义 二、继承体系 三、核心方法解析 1.类结构与属性分析 1.Listenable的定义 2..核心字段 1.属性解析 1._count 2._listeners 3.为什么不用const [] 4._notificationCallStackDep…

大带宽服务器对于高流量网站的作用

随着科学技术的快速发展&#xff0c;越来越多的网站面临着高流量的访问需求&#xff0c;在同一时间中会有着大量的用户进行访问&#xff0c;同时也提高了该企业的知名度&#xff0c;但是这对于服务器的性能需求也在逐渐增高&#xff0c;而大带宽服务器卓越的性能和稳定的传输能…

2025年算法备案发号规律总结与下半年发号预测

上半年发号规律总结图太糊&#xff1f;可看下方表格&#xff08;左划看全表&#xff09;&#x1f447;今年批次算法备案总批次发布时间所发当批算法材料提交时间段审核周期25年第一批第十批2025/3/122025年1月&#xff08;春节前&#xff09;约2个月25年第二批第十一批2025/5/1…

高光谱相机(Hyperspectral Camera)

高光谱相机&#xff08;Hyperspectral Camera&#xff09;高光谱相机&#xff1a;是一种可以采集连续、多达上百个窄波段的光谱信息的成像设备。它的核心特征是&#xff1a;每个像素点都拥有一个完整的光谱曲线&#xff0c;类似于“像素级别的光谱仪”。举例&#xff1a;普通彩…

经典排序算法之归并排序(Merge Sort)

归并算法定义&#xff1a;所谓归并排序是指将两个或两个以上有序的数列&#xff08;或有序表&#xff09;&#xff0c;合并成一个仍然有序的数列&#xff08;或有序表&#xff09;。这样的排序方法经常用于多个有序的数据文件归并成一个有序的数据文件。归并排序相比较之前的排…

Linux系统环境下 Node.js 20 安装实践:glibc 2.17 兼容方案与工具链优化

前言&#xff1a;在 CentOS 7.9 的生产环境中&#xff0c;默认搭载的 glibc 2.17 是系统的核心依赖&#xff0c;直接升级它可能引发稳定性风险。而 Node.js 20 作为较新的运行时&#xff0c;其与 glibc 的兼容性长期困扰着开发者&#xff1a;为什么有些场景下 Node.js 20 能直接…

构建一个简单的Java框架来测量并发执行任务的时间

文章目录一、完整代码二、代码解释1、方法签名2、初始化CountDownLatch3、提交任务到执行器4、任务线程的逻辑5、主线程的逻辑详细解释总结以下代码实现了一个简单的框架&#xff0c;用于测量并发执行任务的时间。它使用了Executor来执行任务&#xff0c;并通过CountDownLatch来…

精通 triton 使用 MLIR 的源码逻辑 - 第001节:triton 的应用简介

项目使用到 MLIR&#xff0c;通过了解 triton 对 MLIR 的使用&#xff0c;体会到 MLIR 在较大项目中的使用方式&#xff0c;汇总一下。1. Triton 概述OpenAI Triton 是一个开源的编程语言和编译器&#xff0c;旨在简化 GPU 高性能计算&#xff08;HPC&#xff09; 的开发&#…

Python爬虫-政务网站自动采集数据框架

前言 本文是该专栏的第81篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者将详细介绍一个基于政务网站进行自动采集数据的爬虫框架。对此感兴趣的同学,千万别错过。 废话不多说,具体细节部分以及详细思路逻辑,跟着笔者直接往下看正文部分。(附带框架完整代码…