首页 > 其他分享 >kubernetes集群中pod访问外网丢包严重问题排查:mtu值设置不对

kubernetes集群中pod访问外网丢包严重问题排查:mtu值设置不对

时间:2023-10-16 15:36:40浏览次数:35  
标签:容器 kubernetes 宿主机 网络 MTU 外网 mtu 数据包

kubernetes集群中pod访问外网丢包严重问题排查:mtu值设置不对

问题描述和初步判断

k8s中部署的数据中台调用指云(open.imzhiyun.com)的sdk接口,调用了23次,成功了3次,其余20次都失败。我这边通过在宿主机上进行tcpdump抓包
抓包命令:

1. 查出调用sdk的容器名称
2. 查出该容器所在宿主机
3. 在这个宿主机上执行抓包命令,正对网卡eth0,域名是open.imzhiyun.com进行抓包:
tcpdump -i eth0 host open.imzhiyun.com -w result.cap

用工具分析下:


通过分析工具可以得知,三次握手会失败,丢包严重。

定位是容器网络问题还是宿主机网络问题

  1. sdk地址检查,无白名单设置,在本地环境、长沙机房开发测试环境调用正常。确保sdk地址没配错。

  2. 提供一个sdk接口调用的jar包,在宿主机上进行调用,测试宿主机网络

    多次执行,通过sdk接口调用jar包的运行结果得知,每次执行都能正常返回正常数据,说明宿主机网络正常。不正常的是容器对外网的网络。

  3. 检查容器内访问外网情况
    使用nsenter工具切换到容器网络(nsenter参考文档:https://www.cnblogs.com/zoujiaojiao/p/17021724.html)

使用百度的地址验证下:

从2个图对比可知,在容器内网络,sdk调用基本不会成功,curl 百度地址偶尔会成功,再次说明容器网卡丢包严重。
通常影响丢包的的配置都是mtu

mtu

最大传输单元(Maximum Transmission Unit)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。
我们在使用互联网时进行的各种网络操作,都是通过一个又一个“数据包”传输来实现的。而MTU指定了网络中可传输数据包的最大尺寸,在我们常用的以太网中,MTU是1500字节。超过此大小的数据包就会将多余的部分拆分再单独传输 。MTU的设置不是一个值天下通用,所以需要我们合理设置特殊场景的MTU 。
首先确认什么是不合理的 :
1.本地MTU值大于网络MTU值时,本地传输的数据包过大导致网络会拆包后传输,不但产生额外的数据包,而且消耗了“拆包、组包”的时间 。
2.本地MTU值小于网络MTU值时,本地传输的数据包可以直接传输,但是未能完全利用网络给予的数据包传输尺寸的上限值,传输能力未完全发挥 。
这样我们就知道:
所谓合理的设置MTU值,就是让本地的MTU值与网络的MTU值一致,既能完整发挥传输性能,又不让数据包拆分。
检测需要设置的合理的值:
大部分网络设备都是1500。如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度。把本机的MTU设成比网关的MTU小或相同,就可以减少丢包

检查宿主机网卡和容器网卡的mtu值

发现容器docker0的mtu值比宿主机eth0的还大!!所以导致丢包严重。

解决问题

将k8s集群所有机器的docker配置/etc/docker/daemon.json 增加 "mtu": 1450 ,如下:

将docker服务进行重启

systemctl restart docker.service

标签:容器,kubernetes,宿主机,网络,MTU,外网,mtu,数据包
From: https://www.cnblogs.com/zoujiaojiao/p/17767398.html

相关文章

  • Build ASP.NET Core applications deployed as Linux containers into an AKS/Kuberne
    原文:https://learn.microsoft.com/en-us/dotnet/architecture/containerized-lifecycle/design-develop-containerized-apps/build-aspnet-core-applications-linux-containers-aks-kubernetesAzureKubernetesServices(AKS)isAzure'smanagedKubernetesorchestrat......
  • 使用 Kubernetes 简化平台工程
    平台工程在现代应用程序开发和部署中发挥的作用至关重要。随着软件应用程序变得越来越复杂和分散,对稳健且可扩展的基础设施的需求变得越来越重要。这就是平台工程的作用所在,它是支持整个软件开发生命周期的支柱。让我们深入探讨平台工程在创建和维护应用程序基础设施方面的重要作......
  • Kubernetes 网络简单介绍
    后续会详细展示其原理并验证下,这里先汇总下,水平比较有限。Kubernetes网络模型Kubernetes使用一个称为CNI(ContainerNetworkInterface)的接口标准,使其网络实现与具体的网络插件解耦。Kubernetes网络模型有以下几个重要的原则:所有Pod都在一个扁平的共享网络中:每个Pod都有一个......
  • 安装kubernetes-v1.26.9集群,安装配置calico网络
    安装kubernetes-v1.26.9集群,安装配置calico网络1、配置基础环境1、资源规划一共三台主机,安装配置一个master01,两个worker01master01:192.168.2.10worker01:192.168.2.11worker02:192.168.2.12镜像仓库服务器:192.168.2.20VMware虚拟机规格:CentOSLinux7(Core)2核CPU、3G内......
  • kubernetes client-go 避坑
    原文链接:https://www.cnblogs.com/gaorong/p/16939111.htmlinformercache中的数据是只读的,任何修改都先deepcopyinformercache中的数据是只读的,任何修改都应该先deepcopy出来,然后提交apiserver,利用apiserverinformerevent重新同步回cache中。如果直接修改cache中的数据......
  • hyper-v设置Centos虚拟机网络配置,与主机通信,且连接外网
    1.新建虚拟交换机  2.设置虚拟机的固定IPvi/etc/sysconfig/network-scripts/ifcfg-eth0 修改BOOTPROTO="static"新增,固定IP的设置:IPADDR、GATEWAY、DNS1、NETMASK、BROARDCAST 3.网络共享 ......
  • 软件开发人员 Kubernetes 入门指南|Part 2
    在第1部分中,我们讲解了Kubernetes的核心组件,Kubernetes是一种开源容器编排器,用于在分布式环境中部署和扩展应用程序;我们还讲解了如何在集群中部署一个简单的应用程序,然后更改其副本数量以扩大或缩小其规模。 在本文中,我们将为您深入讲解Kubernetes提供的网络和监控功能,......
  • Kubernetes:根据进程 Pid 获取 Pod 名称
    前言在管理Kubernetes集群的过程中,我们经常会遇到这样一种情况:在某台节点上发现某个进程资源占用量很高,却又不知道是哪个容器里的进程。有没有办法可以根据进程PID快速找到Pod名称呢?解决假设现在有一个prometheus进程的PID是14338:要获取容器的ID,可以查看PID对应......
  • 基于 ACK Fluid 的混合云优化数据访问(四):将第三方存储目录挂载到 Kubernetes,提升效率和
    作者:车漾前文回顾:本系列将介绍如何基于ACKFluid支持和优化混合云的数据访问场景,相关文章请参考:-基于ACKFluid的混合云优化数据访问(一):场景与架构-基于ACKFluid的混合云优化数据访问(二):搭建弹性计算实例与第三方存储的桥梁-基于ACKFluid的混合云优化数据访问(三):加速......
  • 记一次线上华为云Kubernetes(CCE)环境Jenkins 发版爆雷事故
    一、前言2023年10月11号下午17:16分,临近下班之际,研发同事在办公室发出了尖锐的爆鸣声....紧接着企业微信呼唤,说线上项目突然无法正常发版了....与此同时接收到消息,便展开一系列排查。二、排查思路定位从报错信息上来看,在gitpull项目的过程就出错了,提示无法写入新的配置文件.....c......