Kubernetes排错(十):常见网络故障排查

通用排查思路

Kubernetes 集群内不同服务之间的网络通信出现异常,表现为请求超时、连接失败或响应缓慢,导致服务间依赖关系中断,依赖服务的功能不可用或性能下降,甚至可能波及整个微服务架构,引发连锁反应,造成系统整体不稳定。

排查方法:

第一步:检查Pod网络配置与状态

查看Pod网络配置:

kubectl describe pod -n <namespace>

这里要重点关注Events部分是否有网络配置相关的错误提示,以及IP地址是否已正确分配,如果没有异常则再检查Pod运行状态。

kubectl get pods -n <namespace>

查看Pod是否处于Running状态,如果不是,检查其状态(如CrashLoopBackOff)并进一步分析日志。

第二步:网络连通性测试

这里主要还是通过常用的ping命令来测试。

进行Pod间连通性测试,在有问题的两个Pod中分别执行以下命令测试连通性,例如使用ping或nc(netcat)。

# 在源Pod中执行
kubectl exec -it <source-pod-name> -n <namespace> -- ping <destination-pod-ip># 或者使用nc测试端口连通性
kubectl exec -it <source-pod-name> -n <namespace> -- nc -zv <destination-pod-ip> <port>
第三步:查看网络策略规则

如果以上都没有问题,则有可能是网络策略问题,执行如下命令确认是否有网络策略限制了Pod间的访问。

kubectl get networkpolicies -n <namespace>

如果有相关策略,检查其spec-ingress和spec-egress规则,确保没有意外地拒绝了必要的通信。

第四步:检查Service配置
kubectl describe service <service-name> -n <namespace>kubectl get endpoints <service-name> -n <namespace>

再次执行上述命令来确认Service的类型、选择器、端口配置是否正确,并确保Service有对应的Endpoints,即后端Pod列表。

第五步:查看集群日志

根据异常Pod所在节点,检查节点上的kubelet、网络插件的日志,寻找有关网络配置、连接尝试或错误的信息。

kubectl logs <problematic-pod-name> -n <namespace>

1 . Pod访问外部服务超时

现象: Pod尝试访问外部服务(如数据库或API)时超时。

原因分析:通常情况下是egress规则未正确设置,导致流量无法流出集群。

排查方法:

第一步:确认网络策略

首先,还是检查是否有网络策略限制了Pod访问外部网络,确保没有规则阻止Egress(外出)流量。

kubectl get networkpolicies -n <namespace>
第二步:查看Pod网络配置

确认Pod的网络配置,尤其是iptables规则和路由表。进入Pod内部检查:

kubectl exec -it <pod-name> -n <namespace> -- bash

在Pod内执行以下命令查看路由表:

ip route

并检查iptables规则:

iptables -L -nv
第三步:测试外部连接

直接在Pod中尝试访问外部服务,比如ping一个公共DNS服务器或测试端口连接:

ping 8.8.8.8
nc -vz example.com 443
第四步:DNS解析测试

如果服务访问依赖域名,检查DNS解析是否正常:

nslookup www.baidu.com
第五步:Egress配置检查

如果发现是因为网络策略限制了Egress流量,那么可以创建或修改一个网络策略来允许外部访问。例如,允许所有Egress流量的网络策略:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-egress
spec:podSelector: {}policyTypes:- Egressegress:- {}

然后应用此策略:

kubectl apply -f allow-egress.yaml -n <namespace>

生产环境中请确保根据实际情况调整策略,仅开放必要的端口和目标,保证系统的安全性。

2 . 服务ClusterIP不可达

现象: 服务的ClusterIP地址无法从集群内部访问。

原因分析: 服务的Kubernetes Service配置错误,或kube-proxy服务异常。

排查方法:

第一步:确认服务状态

检查服务是否已经创建并且状态正常:

kubectl get svc -n <namespace>

需要确保服务存在且其类型为ClusterIP。

第二步:服务详情检查

查看服务的详细信息,重点关注ClusterIP、端口映射和Selector是否配置正确:

kubectl describe svc <service-name> -n <namespace>

确认Endpoints列表中至少有一个Pod IP,这表明服务能够找到匹配的Pod。

第三步:验证DNS解析

在有问题的Pod中,尝试解析服务名以确认DNS是否工作正常:

kubectl exec -it <problematic-pod-name> -n <namespace> -- nslookup <service-name>

此时正常来说应能看到服务对应的ClusterIP地址。

第四步:网络连通性测试

从问题Pod向服务的ClusterIP和端口发起ping或TCP连接测试:

kubectl exec -it <problematic-pod-name> -n <namespace> -- bash -c "nc -zv <service-cluster-ip> <service-port>"
第五步:kube-proxy状态检查

kube-proxy负责服务的网络代理,确保它在所有节点上运行正常:

kubectl get pods -n kube-system | grep kube-proxy

如果kube-proxy有问题,查看其日志:

kubectl logs <kube-proxy-pod-name> -n kube-system
第六步:重启kube-proxy

如果以上都没有异常,作为最后的尝试,可以在所有节点上重启kube-proxy服务,可能会解决可能的临时问题,不过一定需要谨慎!:

sudo systemctl restart kube-proxy

3 . Ingress 502 Bad Gateway

当使用Ingress资源时遇到502 Bad Gateway错误,这意味着Ingress控制器无法从后端服务正确接收响应。

第一步:检查Ingress资源配置

首先,确保Ingress资源配置正确,包括路径、服务名称、端口等:

kubectl describe ingress <ingress-name> -n <namespace>
第二步:检查Ingress资源配置

检查关联的服务和Pod是否运行正常:

kubectl get svc -n <namespace>
kubectl get pods -n <namespace>

确认Pod无CrashLoopBackOff或Error状态,服务有正确的端口映射和Selector。

第三步:检查Endpoints

验证服务是否绑定了正确的Pod:

kubectl describe svc <service-name> -n <namespace>

在输出中查找Endpoints部分,确保有Pod IP列表。

第四步:查看Ingress控制器日志

根据使用的Ingress控制器(如Nginx Ingress Controller、Istio Ingress Gateway等),获取其日志以获取更多信息:

# 对于Nginx Ingress Controller
kubectl logs -l app.kubernetes.io/name=ingress-nginx -n ingress-nginx

分析日志中是否有与502错误相关的错误信息或警告。

第五步:确认后端服务可达性

从Ingress所在节点或Pod内尝试直接访问后端服务,以排除网络问题:

kubectl run -it --rm --restart=Never debug --image=busybox -- /bin/sh -n <namespace># 在新Pod中执行
nc -vz <backend-service-ip> <service-port>
第六步:重启Ingress控制器

如果上述步骤未解决问题,尝试重启Ingress控制器Pod:

kubectl delete pod <ingress-controller-pod-name> -n <ingress-controller-namespace>

附:常用k8s排查命令

容器网络故障

确认容器是否已正确启动并运行,并且是否已被正确配置为使用正确的网络。

执行命令,确认 Pod 是否已正确启动并运行。

kubectl get pods

执行命令,确认容器的网络配置是否正确。

kubectl describe pod <pod-name>

检查 Pod 和容器的网络配置,例如 IP 地址、子网掩码、网关、DNS 等是否正确配置。

执行命令 ,查看容器的网络接口信息。

kubectl exec <pod-name> -- ifconfig

检查网络插件是否正常工作,并尝试重启网络插件。
如果使用 Flannel 网络插件,执行命令 查看 Flannel 的日志信息。

kubectl logs -n kube-system -l k8s-app=flannel

如果使用 Calico 网络插件,执行命令,查看 Calico 的日志信息。

kubectl logs -n kube-system -l k8s-app=calico-node

重启网络插件:如果使用 Flannel 网络插件,执行命令

kubectl delete pod -n kube-system -l k8s-app=flannel

如果使用 Calico 网络插件,执行命令。

kubectl delete pod -n kube-system -l k8s-app=calico-node

检查网络设备是否正常工作,例如交换机、路由器、防火墙等是否出现故障。
检查网络设备的日志或配置信息,确认网络设备是否正常工作。

尝试使用 Kubernetes 工具进行诊断,例如 kubectl,以查看 Pod 和容器的状态和日志。
执行命令,查看容器的日志信息。

kubectl logs <pod-name>

执行命令 ,查看容器的状态信息。

kubectl describe pod <pod-name>

如果以上方法无法解决问题,可以考虑重新部署容器网络或更换网络插件。
如果使用 Flannel 网络插件,执行命令 重新部署 Flannel 网络插件。

kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml && kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml,

如果使用 Calico 网络插件,执行命令重新部署 Calico 网络插件。

kubectl delete -f https://docs.projectcalico.org/manifests/calico.yaml && kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

网络策略故障

查看所有网络策略:

kubectl get networkpolicies --all-namespaces

查看网络策略的详细信息:

kubectl describe networkpolicy <network-policy-name> -n <namespace>

检查网络策略的规则是否正确:

kubectl get networkpolicy <network-policy-name> -n <namespace> -o yaml

检查容器是否正确标记:

kubectl get pods --selector=<label-selector> -n <namespace> -o wide

检查容器的端口是否正确配置:

kubectl get pods <pod-name> -n <namespace> -o yaml

检查节点是否正确配置:

kubectl get nodes -o wide

检查网络设备是否正常工作:

kubectl logs <network-device-pod-name> -n <namespace>

如果你的Kubernetes集群使用的是Calico网络策略,你可以使用以下命令:
查看所有Calico网络策略:

kubectl get networkpolicies.projectcalico.org --all-namespaces

查看Calico网络策略的详细信息:

kubectl describe networkpolicy <network-policy-name> -n <namespace>

检查Calico网络策略的规则是否正确:

kubectl get networkpolicy <network-policy-name> -n <namespace> -o yaml
  • 检查Calico网络设备是否正常工作:
kubectl logs -n kube-system -l k8s-app=calico-node

DNS 故障

  • 检查网络设备是否连通:
ping <network-device-ip>
  • 检查网络设备的日志信息:
kubectl logs <network-device-pod-name> -n <namespace>
  • 检查网络设备的配置信息:
kubectl exec -it <network-device-pod-name> -n <namespace> -- <command> <arguments>
  • 检查网络设备的版本信息:
kubectl exec -it <network-device-pod-name> -n <namespace> -- <command> <arguments>
  • 检查网络设备的连接状态:
kubectl exec -it <network-device-pod-name> -n <namespace> -- <command> <arguments>

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

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

相关文章

PyTorch 张量与自动微分操作

笔记 1 张量索引操作 import torch ​ # 下标从左到右从0开始(0->第一个值), 从右到左从-1开始 # data[行下标, 列下标] # data[0轴下标, 1轴下标, 2轴下标] ​ def dm01():# 创建张量torch.manual_seed(0)data torch.randint(low0, high10, size(4, 5))print(data->,…

接口的基础定义与属性约束

在 TypeScript 中&#xff0c;接口&#xff08;Interface&#xff09;是一个非常强大且常用的特性。接口定义了对象的结构&#xff0c;包括对象的属性和方法&#xff0c;可以为对象提供类型检查和约束。通过接口&#xff0c;我们可以清晰地描述一个对象应该具备哪些属性和方法。…

高效全能PDF工具,支持OCR识别

软件介绍 PDF XChange Editor是一款功能强大的PDF编辑工具&#xff0c;支持多种操作功能&#xff0c;不仅可编辑PDF内容与图片&#xff0c;还具备OCR识别表单信息的能力&#xff0c;满足多种场景下的需求。 软件特点 这款PDF编辑器完全免费&#xff0c;用户下载后直接…

OpenCV 中用于背景分割的一个类cv::bgsegm::BackgroundSubtractorGMG

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::bgsegm::BackgroundSubtractorGMG 是 OpenCV 中用于背景分割的一个类&#xff0c;它实现了基于贝叶斯推理的背景建模算法&#xff08;Bayesi…

MongoDB知识框架

简介&#xff1a;MongoDB 是一个基于分布式文件存储的数据库&#xff0c;属于 NoSQL 数据库产品&#xff0c;以下是其知识框架总结&#xff1a; 一、数据模型 文档&#xff1a;MongoDB 中的数据以 BSON&#xff08;二进制形式的 JSON&#xff09;格式存储在集合中&#xff0c;…

WEBSTORM前端 —— 第2章:CSS —— 第8节:网页制作2(小兔鲜儿)

目录 1.项目目录 2.SEO 三大标签 3.Favicon 图标 4.版心 5.快捷导航(shortcut) 6.头部(header) 7.底部(footer) 8.banner 9.banner – 圆点 10.新鲜好物(goods) 11.热门品牌(brand) 12.生鲜(fresh) 13.最新专题(topic) 1.项目目录 【xtx-pc】 ima…

1、RocketMQ 核心架构拆解

1. 为什么要使用消息队列&#xff1f; 消息队列&#xff08;MQ&#xff09;是分布式系统中不可或缺的中间件&#xff0c;主要解决系统间的解耦、异步和削峰填谷问题。 解耦&#xff1a;生产者和消费者通过消息队列通信&#xff0c;彼此无需直接依赖&#xff0c;极大提升系统灵…

[Linux网络_71] NAT技术 | 正反代理 | 网络协议总结 | 五种IO模型

目录 1.NAT技术 NAPT 2.NAT和代理服务器 3.网线通信各层协议总结 补充说明 4.五种 IO 模型 1.什么是IO&#xff1f;什么是高效的IO&#xff1f; 2.有那些IO的方式&#xff1f;这么多的方式&#xff0c;有那些是高效的&#xff1f; 异步 IO &#x1f3a3; 关键缺陷类比…

Unity基础学习(八)时间相关内容Time

众所周知&#xff0c;每一个游戏都会有自己的时间。这个时间可以是内部&#xff0c;从游戏开始的时间&#xff0c;也可以是外部真实的物理时间&#xff0c;时间相关内容 主要用于游戏中 参与位移计时 时间暂停等。那么我们今天就来看看Unity中和时间相关的内容。 Unity时间功能…

Java游戏服务器开发流水账(1)游戏服务器的架构浅析

新项目立项停滞&#xff0c;头大。近期读老项目代码看到Java&#xff0c;笔记记录一下。 为什么要做服务器的架构 游戏服务器架构设计具有多方面的重要意义&#xff0c;它直接关系到游戏的性能、可扩展性、稳定性以及用户体验等关键因素 确保游戏的流畅运行 优化数据处理&a…

计算机视觉与深度学习 | 基于Transformer的低照度图像增强技术

基于Transformer的低照度图像增强技术通过结合Transformer的全局建模能力和传统图像增强理论(如Retinex),在保留颜色信息、抑制噪声和平衡亮度方面展现出显著优势。以下是其核心原理、关键公式及典型代码实现: 一、原理分析 1. 全局依赖建模与局部特征融合 Transformer的核…

Linux 文件目录管理常用命令

pwd 显示当前绝对路径 cd 切换目录 指令备注cd -回退cd …返回上一层cd ~切换到用户主目录 ls 列出目录的内容 指令备注ls -a显示当前目录中的所有文件和目录&#xff0c;包括隐藏文件ls -l以长格式显示当前目录中的文件和目录ls -hl以人类可读的方式显示当前目录中的文…

【Linux 系统调试】性能分析工具perf使用与调试方法

目录 一、perf基本概念 1‌. 事件类型‌ 2‌. 低开销高精度 3‌. 工具定位‌ 二、安装与基础配置 1. 安装方法 2. 启用符号调试 三、perf工作原理 1. 数据采集机制 2. 硬件事件转化流程 四、perf应用场景 1. 系统瓶颈定位 2. 锁竞争优化 3. 缓存优化 五、perf高级…

嵌入式中屏幕的通信方式

LCD屏通信方式详解 LCD屏&#xff08;液晶显示屏&#xff09;的通信方式直接影响其数据传输效率、显示刷新速度及硬件设计复杂度。根据应用场景和需求&#xff0c;LCD屏的通信方式主要分为以下三类&#xff0c;每种方式在协议类型、数据速率、硬件成本及适用场景上存在显著差异…

【el-admin】el-admin关联数据字典

数据字典使用 一、新增数据字典1、新增【图书状态】和【图书类型】数据字典2、编辑字典值 二、代码生成配置1、表单设置2、关联字典3、验证关联数据字典 三、查询操作1、模糊查询2、按类别查询&#xff08;下拉框&#xff09; 四、数据校验 一、新增数据字典 1、新增【图书状态…

【Spring】Spring MVC笔记

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…

如何在大型项目中解决 VsCode 语言服务器崩溃的问题

在大型C/C项目中&#xff0c;VS Code的语言服务器&#xff08;如C/C扩展&#xff09;可能因内存不足或配置不当频繁崩溃。本文结合系统资源分析与实战技巧&#xff0c;提供一套完整的解决方案。 一、问题根源诊断 1.1 内存瓶颈分析 通过top命令查看系统资源使用情况&#xff…

LeetCode百题刷002摩尔投票法

遇到的问题都有解决的方案&#xff0c;希望我的博客可以为你提供一些帮助 图片源自leetcode 题目&#xff1a;169. 多数元素 - 力扣&#xff08;LeetCode&#xff09; 一、排序法 题目要求需要找到多数值&#xff08;元素个数>n/2&#xff09;并返回这个值。一般会想到先…

Android Studio Gradle 中 只显示 Tasks 中没有 build 选项解决办法

一、问题描述 想把项目中某一个模块的代码单独打包成 aar ,之前是点击 AndroidStudio 右侧的 Gradle 选项&#xff0c;然后再点击需要打包的模块找到 build 进行打包&#xff0c;但是却发现没有 build 选项。 二、解决办法 1、设置中勾选 Configure all Gradle tasks… 选项 …

深入浅出之STL源码分析2_stl与标准库,编译器的关系

引言 在第一篇博客中&#xff0c;深入浅出之STL源码分析1_vector基本操作-CSDN博客 我们将引出下面的几个问题 1.刚才我提到了我的编译器版本是g 11.4.0&#xff0c;而我们要讲解的是STL&#xff08;标准模板库&#xff09;&#xff0c;那么二者之间的关系是什么&#xff1f;…