K8S故障处理指南:网络问题排查思路

1. 前言

对于私有化环境,客户的网络架构,使用的云平台存在着各种差异,K8S网络可能会出现各种问题,此文着重讲解遇到此种问题的排查方法和思路,不会涉及相关网络底层技术描述.

环境说明

由于我们的k8s网络组件默认使用了flannel,这里描述的集群网络,均为flannel。但如果你使用了其他CNI组件,依然可以参考此文章的排查思路.

2. 异常场景

如何判断k8s集群网络出现异常?

  • 当集群出现pods大量异常,日志显示dns解析失败,或者节点间网络连接失败等,即可判断是集群网络异常

我们可以通过如下几种方式进行排查。当任何一种方式的结果非预期内,则确认k8s集群网络出现异常

2. 排查步骤

  • 测试节点互ping

可以按照如下步骤操作

查询node名称,podcidr,address并打印

[root@localhost ~]# kubectl get nodes -o jsonpath='{range .items[*]}[name:{.metadata.name} , podCIDR:{.spec.podCIDR} , ipaddr:{.status.addresses[0].address}]{"\n"} {end}'
[name:10.28.87.59 , podCIDR:172.27.1.0/24 , ipaddr:10.28.87.59]
[name:10.28.87.60 , podCIDR:172.27.0.0/24 , ipaddr:10.28.87.60]
[name:10.28.87.61 , podCIDR:172.27.2.0/24 , ipaddr:10.28.87.61]
[name:10.28.87.62 , podCIDR:172.27.4.0/24 , ipaddr:10.28.87.62]
[name:10.28.87.63 , podCIDR:172.27.3.0/24 , ipaddr:10.28.87.63]
[name:10.28.87.64 , podCIDR:172.27.5.0/24 , ipaddr:10.28.87.64]

此命令需要在所有节点下执行,可在部署机器上使用ansible调用使用上述命令获取到的CIDR地址,进行ping操作,seq根据节点数量进行设置

从上面结果可以看到共6个K8S节点,子网分别是172.27.0-172.27.5子网段。

使用下边shell脚本测试pod子网,通的话打印up

[root@localhost ~]# for ip in $(seq 0 5);do ping -c2 -W1 -q 172.27.$ip.1 2>1 &>/dev/null && echo "172.27.$ip.1 up" || echo "172.27.$ip.1 down";done
172.27.0.1 up
172.27.1.1 up
172.27.2.1 up
172.27.3.1 up
172.27.4.1 up
172.27.5.1 up

非预期结果: 出现某个节点固定的ping异常,即认为对应节点间vxlan通信异常,检查对应节点的网络即可

  • tcp,udp查询

需要在所有节点上执行,可在一台机器上使用ansible调用

ping操作属于三层操作,由于某些环境会禁ping,因此我们可以使用如下命令进行确认

使用http请求访问coredns metrics接口,状态码为200时正常,状态码000代表网络异常不通

[root@CentOS76 ~]# kubectl get pods -n kube-system -o wide | grep coredns | awk '{print $6}' | xargs -i  curl --connect-timeout 2 -o /dev/null -s -w "%{http_code}\n" http://{}:9153/metrics
200
200
200
200
200
200

使用dns查询kubernetes.default地址。有返回则代表正常

[root@localhost ~]# kubectl get pods -n kube-system -o wide | grep coredns | awk '{print $6}' | xargs -l nslookup -type=a kubernetes.default.svc.cluster.local
Server:         172.27.2.23
Address:        172.27.2.23#53Name:   kubernetes.default.svc.cluster.local
Address: 172.26.0.1
---------
Server:         172.27.1.131
Address:        172.27.1.131#53Name:   kubernetes.default.svc.cluster.local
Address: 172.26.0.1
---------
Server:         172.27.3.57
Address:        172.27.3.57#53Name:   kubernetes.default.svc.cluster.local
Address: 172.26.0.1
---------
Server:         172.27.0.29
Address:        172.27.0.29#53Name:   kubernetes.default.svc.cluster.local
Address: 172.26.0.1
---------
Server:         172.27.5.53
Address:        172.27.5.53#53Name:   kubernetes.default.svc.cluster.local
Address: 172.26.0.1
---------
Server:         172.27.4.65
Address:        172.27.4.65#53Name:   kubernetes.default.svc.cluster.local
Address: 172.26.0.1
---------

非预期结果:dns查询报connection timed out; no servers could be reached, curl报000,都代表网络可能存在异常

3. 异常场景

当我们通过上述方式,确认集群节点存在异常时,可以使用如下思路进行逐一排查

  • ip_forward内核被重置为0

  • flannel通信异常

  • 启用了firewalld防火墙

  • 启用了安全软件

  • ip_forward

名词解释:ip_forward代表了路由转发特性,为0时不开启,设置为1时代表启用。由于vxlan的跨三层特性, 集群节点需要转发目标主机非自己的数据包.
影响范围: 如果此值设为0,会导致跨节点通信异常.

出现原因: 在部署时,会向/etc/sysctl.conf里边添加net.ipv4.ip_forward=1,来保证永久生效。

问题定位: 出现在集群重启后,发现pods异常,网络不通. 通过tcmdump抓包发现flannel流量正常。

处理方式

查询本机内核参数, 在所有节点上执行,可在部署机上使用ansible调用,为读操作,可放心执行

[root@localhost ~]# sysctl -n net.ipv4.ip_forward
0

打印sysctl加载链,会变更相关内核参数,生产环境禁用使用(如果出现ip_forward为0则可使用)

[root@localhost ~]# sysctl --system
* Applying /usr/lib/sysctl.d/00-system.conf ...
......
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
.....
* Applying /usr/lib/sysctl.d/50-default.conf ...
.......
* Applying /etc/sysctl.d/99-sysctl.conf ...
.......
* Applying /etc/sysctl.conf ...
.......

找到具体是哪个文件修改了ip_forward为0,则修改此文件,并重载内核参数。无异常禁止使用

[root@localhost ~]# sysctl -p
  • flannel通信异常

名词说明: vxlan是vlan的拓展协议,为overlay网络,可以穿透三层网络对二层进行扩展,即大二层网络。flannel我们默认使用了vxlan做为封装协议,端口为8472
影响范围: 跨节点通信异常
问题定位: 对udp 8472端口抓发,发现只有出站流量,未有入站流量,即可认定为flannel vxlan通信异常
出现原因: 安全组封禁,vxlan端口冲突,网卡异常等。由于flannel异常的原因多种多样,此次仅针对常见情况进行描述。建议具体问题具体分析。
问题处理: 使用nc等相关命令进行测试,如果抓包仍未发现入站流量,且其他udp端口正常,则可使用修改port的方式

添加Port字段,将通信端口修改为8475

[root@localhost ~]# kubectl edit cm -n kube-system kube-flannel-cfg
net-conf.json: |{"Network": "172.27.0.0/16","Backend": {"Type": "vxlan","Port": 8475}}

修改后需要重启相关daemonset pods

[root@localhost ~]# kubectl get pods -n kube-system | grep flannel | xargs kubectl delete pods -n kube-system

修改port不生效,可使用host-gw 如果内网各节点二层互通,可使用host-gw模式,此模式兼容性好,网络效率高.

[root@localhost ~]# kubectl edit cm -n kube-system kube-flannel-cfg
net-conf.json: |{"Network": "172.27.0.0/16","Backend": {"Type": "host-gw",}

如果无法定位问题,可以通过抓包的方式来判断

例如:当时coredns网络不通时,通过curl测试

curl -I 10.187.1.24:9153/metrics

然后再开一个窗口抓包

tcpdump -nn -i flannel.1 host 10.187.1.24 and port 9153 -vv

防火墙排查

名词解释: 此处的防火墙指Linux的软件防火墙,在Cenots上叫firewalld, 在UOS下叫UFW. 默认的软件防火墙会导致相关数据库被拦截
影响范围: 特定服务访问异常,集群节点互通异常
问题定位: 对iptables表链进行分析,发现有非预期的规则出现,则代表存在其他防火墙规则
出现原因: 客户安装安全软件,或者是非预期的软件行为导致
问题排查:

一般看到ufw, public, zone这种,都可能是默认的系统防火墙

[root@localhost ~]# iptables-save | egrep  "^:" | egrep -v "KUBE|CNI|DOCKER"
:FORWARD_IN_ZONES - [0:0]
:FORWARD_IN_ZONES_SOURCE - [0:0]
:FORWARD_OUT_ZONES - [0:0]
:FORWARD_OUT_ZONES_SOURCE - [0:0]

发现后手动关闭,以centos7为例

[root@localhost ~]# systemctl stop firewalld

iptables FORWARD转发链添加了REJECT规则,该规则在ACCEPT之上

图片

删除规则后正常

iptables -D FORWARD -j REJECT --reject-with icmp-host-prohibited

常见安全软件排查

qaxsafed  # 奇安信,
sangfor_watchdog # 深信服安全软件
YDservice  #qcloud安全软件,影响pod和docker桥接网络
Symantec #赛门铁克的安全软件
start360su_safed  #360安全软件
gov_defence_service
gov_defence_guard      #  ps aux | grep defence 
wsssr_defence_daemon   # 奇安信服务器安全加固软件
wsssr_defence_service
wsssr_defence_agent   #影响pod网络
kesl #卡巴斯基安全软件,影响容器通信 

名词解释: 和在windows环境下是一样的,xc背景下,linux的各类安全软件也非常多,如奇安信,深信服等
影响范围: 特定服务访问异常
问题定位: 以上所有排查方式都尝试过,则可往此方面排查
出现原因: 客户安全软件在内核网络层hook了对应函数,相关规则过滤了特定的应用数据库,导致异常

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

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

相关文章

5.网络游戏逆向分析与漏洞攻防-游戏网络架构逆向分析-测试需求与需求拆解

内容参考于:易道云信息技术研究院VIP课 上一个内容:模拟游戏登陆器启动游戏并且完成注入 首先正常分析软件程序有没有漏洞,需要通过它的操作侵入,比如买东西,就通过买东西的按钮它背后有源代码就看源代码&#xff0c…

【PythonGIS】基于Python融合矢量数据(多面合一)

之前发过使用批量合并矢量数据的文章:【Python&GIS】基于Python批量合并矢量数据,正好前段时间有需求把矢量数据进行融合,然后就编了一段融合矢量数据的代码。今天就和大家分享一下如何使用Python对矢量数据实现融合的操作。 1.定义 首先…

基于Embedding召回和DSSM双塔模型

文章目录 基于Embedding召回介绍基于Embedding召回算法分类I2I召回U2I召回 DSSM模型DSSM双塔模型层次 基于Embedding召回介绍 基于embedding的召回是从内容文本信息和用户查询的角度出发,利用预训练的词向量模型或深度学习模型,将文本信息转换成向量进行…

三、创建脚手架和脚手架分析

三、创建脚手架 一、环境准备 1、安装node.js **下载地址:**https://nodejs.org/zh-cn/界面展示 2、检查node.js版本 查看版本的两种方式 node -vnode -version 出现版本号则说明安装成功(最新的以官网为准) 3、为了提高我们的效率&…

深度学习从入门到不想放弃-7

上一章的内容 深度学习从入门到不想放弃-6 (qq.com) 今天讲的也算基础(这个系列后来我一寻思,全是基础 ),但是可能要着重说下,今天讲前向计算和反向传播,在哪儿它都永远是核心,不管面对什么模型 前向计算: 有的叫也叫正向传播,正向计算的,有的直接把前向的方法梯度下…

祖龙娱乐 x Incredibuild

关于祖龙娱乐 祖龙娱乐有限公司(下文简称“祖龙娱乐”)是一家总部位于北京的移动游戏开发公司,成立于 2014 年,拥有成功的大型多人在线角色扮演游戏移动游戏组合,如《六龙争霸》、《梦幻诛仙》和《万王之王 3D》。公司…

微信小程序 ---- 慕尚花坊 项目初始化

目录 项目介绍 01. 项目概述 02. 项目演示 03. 项目技术栈 04. 接口文档 申请开发权限 项目初始化 01. 创建项目与项目初始化 02. 自定义构建 npm 集成Sass 03. 集成项目页面文件 04. VsCode 开发小程序项目 项目介绍 01. 项目概述 [慕尚花坊] 是一款 同城鲜花订购…

Context Capture无法量测连接点,Survey提示Read only只读模式

Context Capture无法量测连接点,Surveys提示Read only只读模式 出现这个问题一般是因为当前block已经完成三维重建,所以无法再编辑稀疏重建(空三)结果。只能把当前block复制一份,在复制的block上量测新的连接点。如下…

PowerDesigner 安装

PowerDesigner 安装汉化破解使用过程 - 沦陷 - 博客园 (cnblogs.com)https://www.cnblogs.com/huangting/p/12654057.html

不要浪费

解法&#xff1a; 记录一下tle的代码 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define endl \n bool check(vector<int>& a, int l,int k) {int sum 0;for (int i 0; i < a.size() && l…

vue3中使用 tui-image-editor进行图片处理,并上传

效果图 下载包 pnpm i tui-image-editor pnpm i tui-color-picker调用组件 //html部分 <el-dialog v-model"imgshow" destroy-on-close width"40%" draggable align-center :show-close"true":close-on-click-modal"false">&l…

基于springboot+vue的视频网站系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Stable Diffusion 模型分享:FenrisXL(芬里斯XL)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

IO进程线程第6天

1.使用有名管道完成两个进程的相互通信 send.c代码如下&#xff1a; #include <myhead.h>int main(int argc, const char *argv[]) {pid_t pidfork();if(pid>0){//父进程//从管道1中读取数据int fd-1;if((fdopen("./mkfifo1",O_RDONLY))-1){perror("…

【安卓基础3】Activity(一)

&#x1f3c6;作者简介&#xff1a;|康有为| &#xff0c;大四在读&#xff0c;目前在小米安卓实习&#xff0c;毕业入职 &#x1f3c6;本文收录于 安卓学习大全&#xff0c;欢迎关注 &#x1f3c6;安卓学习资料推荐&#xff1a; 视频&#xff1a;b站搜动脑学院 视频链接 &…

Sora横空出世!AI将如何撬动未来?

近日&#xff0c;OpenAI 发布首个视频生成“Sora”模型&#xff0c;该模型通过接收文字指令&#xff0c;即可生成60秒的短视频。 而在2022年末&#xff0c;同样是OpenAI发布的AI语言模型ChatGPT&#xff0c;简化了文本撰写、创意构思以及代码校验等任务。用户仅需输入一个指令&…

【IC设计】Chisel API之Arbiter和RRArbiter的使用

文章目录 介绍Chisel的Valid和Ready流控build.sbtRRArbiter代码示例 介绍 仲裁器在NoC路由器中是重要的组成部分&#xff0c;虚通道仲裁和交叉开关仲裁都需要使用仲裁器。 Chisel提供了Arbiter和RRArbiter仲裁器 Arbiter是基础的低位优先仲裁器&#xff0c; RRArbiter初始情况…

前端构建效率优化之路

项目背景 我们的系统&#xff08;一个 ToB 的 Web 单页应用&#xff09;前端单页应用经过多年的迭代&#xff0c;目前已经累积有大几十万行的业务代码&#xff0c;30 路由模块&#xff0c;整体的代码量和复杂度还是比较高的。 项目整体是基于 Vue TypeScirpt&#xff0c;而构…

ProtoBuf认识与Windows下的安装

protobuf简介 Protobuf 是 Protocol Buffers 的简称&#xff0c;它是 Google 公司开发的一种数据描述语言&#xff0c;是一种轻便高效的结 构化数据存储格式&#xff0c;可以用于结构化数据&#xff0c;或者说序列化。它很适合做数据存储 或 RPC 数据交换格 式 。可用于通讯…

WebServer -- 定时器处理非活动连接(上)

目录 &#x1f34d;函数指针 &#x1f33c;基础知识 &#x1f419;整体概述 &#x1f382;基础API sigaction 结构体 sigaction() sigfillset() SIGALRM, SIGTERM 信号 alarm() socketpair() send() &#x1f4d5;信号通知流程 统一事件源 信号处理机制 &#x…