k8smaster网络问题解决

上周遇到一个问题,k8s 的 master 节点 ping pod 的 ip 是不通的,k8s 的其他节点可以正常 ping 通 pod ip 节点。master 的 ping serviceip 是通的。

查看 route -n。发现路由表是没有问题的,开始怀疑网络配置,最后定位到时因为加入了虚拟 ip,造成的,删除虚拟 ip 就可以了。

通过 tcpdump -i eth0 icmp -n 这个是可以看到 ping 包的

抓包工具查看

1
2
3
4
5
6
7
8
9
使用 tcpdump 指定端口 24568 抓容器 netns 中 eth0 网卡的包:

1
tcpdump -i eth0 -nnnn -ttt port 24568
在其它节点准备使用 nc 指定源端口为 24568 向容器发包:

1
nc -u 24568 172.16.1.21 80
观察抓包结果:

不指定任何参数

监听第一块网卡上经过的数据包。主机上可能有不止一块网卡,所以经常需要指定网卡。

1
tcpdump

监听特定网卡

1
tcpdump -i en0

监听特定主机

例子:监听本机跟主机182.254.38.55之间往来的通信包。

备注:出、入的包都会被监听。

1
tcpdump host 182.254.38.55

特定来源、目标地址的通信

特定来源

1
tcpdump src host hostname

特定目标地址

1
tcpdump dst host hostname

如果不指定srcdst,那么来源 或者目标 是 hostname 的通信都会被监听

1
tcpdump host hostname

特定端口

1
tcpdump port 3000

监听 TCP/UDP

服务器上不同服务分别用了 TCP、UDP 作为传输层,假如只想监听 TCP 的数据包

1
tcpdump tcp

来源主机+端口+TCP

监听来自主机123.207.116.169在端口22上的 TCP 数据包

1
tcpdump tcp port 22 and src host 123.207.116.169

监听特定主机之间的通信

1
tcpdump ip host 210.27.48.1 and 210.27.48.2

210.27.48.1除了和210.27.48.2之外的主机之间的通信

1
tcpdump ip host 210.27.48.1 and ! 210.27.48.2

稍微详细点的例子

1
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap

(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp 这些选项等都要放到第一个参数的位置,用来过滤数据报的类型 (2)-i eth1 : 只抓经过接口 eth1 的包 (3)-t : 不显示时间戳 (4)-s 0 : 抓取数据包时默认抓取长度为 68 字节。加上-S 0 后可以抓到完整的数据包 (5)-c 100 : 只抓取 100 个数据包 (6)dst port ! 22 : 不抓取目标端口是 22 的数据包 (7)src net 192.168.1.0/24 : 数据包的源网络地址为 192.168.1.0/24 (8)-w ./target.cap : 保存成 cap 文件,方便用 ethereal(即 wireshark)分析

抓 http 包

TODO

限制抓包的数量

如下,抓到 1000 个包后,自动退出

1
tcpdump -c 1000

保存到本地

备注:tcpdump 默认会将输出写到缓冲区,只有缓冲区内容达到一定的大小,或者 tcpdump 退出时,才会将输出写到本地磁盘

1
tcpdump -n -vvv -c 1000 -w /tmp/tcpdump_save.cap

也可以加上-U强制立即写到本地磁盘(一般不建议,性能相对较差)

让 master 节点不可以调度

1
 kubectl taint node k8s-master node-role.kubernetes.io/master="":NoSchedule

批量删除驱逐的 pod

1
2
3
kubectl  get pods | grep Evicted | awk '{print$1}'| xargs kubectl delete pods

kubectl  get pods -n kube-system | grep Evicted | awk '{print$1}'| xargs kubectl delete -n kube-system pods

xrgs 的用法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
-a file 从文件中读入作为sdtin
-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
-p 当每次执行一个argument的时候询问一次用户。
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
-t 表示先打印命令,然后再执行。
-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
-s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
-L num 从标准输入一次读取 num 行送给 command 命令。
-l 同 -L。
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
-x exit的意思,主要是配合-s使用。。
-P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。
Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up