美文网首页
Kubernetes 实现统计请求 Pod 的来源 IP 的方式

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

作者: awker | 来源:发表于2021-07-29 23:36 被阅读0次

    需求背景
    比如 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<UP,BROADCAST,RUNNING,MULTICAST>  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<UP,LOOPBACK,RUNNING>  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 的方式

          本文链接:https://www.haomeiwen.com/subject/jnfqvltx.html