Kubernetes 实现统计请求 Pod 的来源 IP 的方式

需求背景
比如 Pod 运行了一个 Nginx 服务,但此 Nginx 没有开启 access.log 日志。
此时想要 不重启这个 Pod,实现统计请求这个 Pod 的来源 IP,该如何操作?

需求实现
可以通过 nsenter 进入 Pod 的 Network Namespace ,使用 tcpdump 实现抓取 Pod 的来源 IP 。

操作步骤

1、根据 Pod Name 获取 Pod 所在的 Node 节点和 Docker CONTAINER ID 。
kubectl -n [namespace] describe pod [pod name]

// 获取 Node 节点 IP 。
# kubectl -n prod describe pod foo-bar-5cbcb87c68-aqzzc | grep "Node:"
Node:         cn-taiwan.192.168.1.52/192.168.1.52

// 获取 Docker CONTAINER ID (根据 Pod 的配置,可能会有多个 Container,选择需要的 CONTAINER ID 即可。)
# kubectl -n prod describe pod foo-bar-5cbcb87c68-aqzzc | grep "Container ID"
    Container ID:   docker://beb3a1b3888454bae42f07625e666c5a4872e64e6e132481543003e50211c283

2、登录 Node 节点后,根据 Docker CONTAINER ID 获取容器 PID 。
docker inspect -f {{.State.Pid}} [Container ID]

// ssh 登录 192.168.1.52 节点后,执行以下操作获取容器 PID 。
# docker inspect -f {{.State.Pid}} beb3a1b3888454bae42f07625e666c5a4872e64e6e132481543003e50211c283
3773866

3、使用 nsenter 进入该容器的 Network Namespace 。
nsenter --net --target [pid]

# nsenter --net --target 3773866
// 可以看到 Pod 的网卡 eth0 和 IP 192.168.11.151 。
# ifconfig 
eth0: flags=4163  mtu 1500
        inet 192.168.11.151  netmask 255.255.255.255  broadcast 0.0.0.0
        ether 12:5d:4e:87:97:31  txqueuelen 0  (Ethernet)
        RX packets 1357962413  bytes 438770918589 (408.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1627361638  bytes 434587680212 (404.7 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 217123213  bytes 127795640805 (119.0 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 217123213  bytes 127795640805 (119.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

4、使用 tcpdump 实现抓取请求 Pod 的来源 IP,来统计分析。

// 使用 tcpdump 抓包。
# tcpdump -i eth0 -nn -q ip > /tmp/tcpstat.txt
// 使用 shell 脚本统计请求这个 Pod 的来源 IP 。
# cat /tmp/tcpstat.txt | grep -v "192.168.11.151" | awk '{print $3}'| cut -d '.' -f 1-4 | awk '{a[$0]++}END{for(i in a){print i,a[i]}}' | sort -nrk 2 | head -n 20
172.33.63.113 418
10.56.1.9 357
10.56.1.243 335
172.44.41.177 55
150.206.225.135 14

参考:

  1. https://man7.org/linux/man-pages/man1/nsenter.1.html
  2. https://stackoverflow.com/questions/49826395/extract-unique-ips-from-live-tcpdump-capture

你可能感兴趣的:(Kubernetes 实现统计请求 Pod 的来源 IP 的方式)