Skip to main content

2 posts tagged with "Kubernetes"

Kubernetes tag description

View All Tags

nsenter命令的使用

· 2 min read
1cobot
开发者

nsenter简介

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。

我们使用 Kubernetes 时难免发生一些网络问题,往往需要进入容器的网络命名空间 (netns) 中,进行一些网络调试来定位问题,本文介绍如何进入容器的 netns。

排查步骤

获取容器的ID

root@master01:~# kubectl describe pods nginx-demo-65df8cb4c4-zbckd 

Containers:
nginx:
Container ID: containerd://d9ec0a5a912e0b6e21b76b86c2e02c114a3906e2cb87e3de3b84ec1e93b43c54

获取PID

拿到 container id 后,查询 pod 所在节点,去获取其主进程 pid

# 查看pod所在节点
root@master01:~# kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-demo-65df8cb4c4-zbckd 1/1 Running 0 10m 10.244.2.8 node03 <none> <none>

# 查询主进程pid
root@node03:~# nerdctl inspect d9ec0a5a912e0b6e21b76b86c2e02c114a3906e2cb87e3de3b84ec1e93b43c54 | grep -i pid
"Pid": 4361,

使用nsenter命令进入容器的netns

root@node03:~# nsenter -n -t 4361

调试网络

成功进入容器的 netns,可以使用节点上的网络工具进行调试网络,可以首先使用 ip a 验证下 ip 地址是否为 pod ip:

root@node03:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
link/ether ea:e0:56:fc:84:40 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.244.2.8/24 brd 10.244.2.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::e8e0:56ff:fefc:8440/64 scope link
valid_lft forever preferred_lft forever

tcpdump抓包与分析

· 2 min read
1cobot
开发者

抓包基础

# 安装tcpdump
[root@localhost ~]# yum install -y tcpdump

# 抓包内容实时显示到控制台
# 这个命令的意思是在网络接口 eth0 上捕获发送或接收到目标主机 IP 地址为 192.168.91.41 的所有数据包,并以可读的日期和时间的格式显示时间戳。
[root@localhost ~]# tcpdump -i eth0 host 192.168.91.41 -nn -tttt

# 抓包内容实时显示到控制台
[root@localhost ~]# tcpdump -i eth0 host 192.168.91.41 -nn -tttt
[root@localhost ~]# tcpdump -i any host 192.168.91.41 -nn -tttt
[root@localhost ~]# tcpdump -i any host 192.168.91.41 and port 8088 -nn -tttt
# 抓包存到文件
[root@localhost ~]# tcpdump -i eth0 -w test.pcap
# 读取抓包内容
[root@localhost ~]# tcpdump -r test.pcap -nn -tttt
常用参数

-r: 指定包文件。
-nn: 显示数字ip和端口,不转换成名字。
-tttt: 显示时间戳格式: 2006-01-02 15:04:05.999999

轮转抓包

# 每100M轮转一次,最多保留200个文件 (推荐,文件大小可控,可通过文件修改时间判断报文时间范围)
[root@localhost ~]# tcpdump -i eth0 port 8880 -w cvm.pcap -C 100 -W 200

# 每2分钟轮转一次,后缀带上时间
[root@localhost ~]# tcpdump -i eth0 port 31780 -w node-10.70.10.101-%Y-%m%d-%H%M-%S.pcap -G 120

过滤连接超时的包(reset)

一般如果有连接超时发生,一般 client 会发送 reset 包,可以过滤下:

[root@localhost ~]# tcpdump -r test.pcap 'tcp[tcpflags] & (tcp-rst) != 0' -nn -ttt

统计流量源IP

[root@localhost ~]# tcpdump -i eth0 dst port 60002 -c 10000|awk '{print $3}'|awk -F. -v OFS="." '{print $1,$2,$3,$4}'|sort |uniq -c|sort -k1 -n