上周遇到一个问题,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
观察抓包结果:
|
不指定任何参数
监听第一块网卡上经过的数据包。主机上可能有不止一块网卡,所以经常需要指定网卡。
监听特定网卡
监听特定主机
例子:监听本机跟主机182.254.38.55
之间往来的通信包。
备注:出、入的包都会被监听。
1
|
tcpdump host 182.254.38.55
|
特定来源、目标地址的通信
特定来源
1
|
tcpdump src host hostname
|
特定目标地址
1
|
tcpdump dst host hostname
|
如果不指定src
跟dst
,那么来源 或者目标 是 hostname 的通信都会被监听
特定端口
监听 TCP/UDP
服务器上不同服务分别用了 TCP、UDP 作为传输层,假如只想监听 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 个包后,自动退出
保存到本地
备注: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 ,这个例子我没有想到,应该平时都用不到的吧。
|