背景
k8s的网络比较复杂, 可能会遇到一些网络问题。当 我们通过检查一些配置和日志仍然无法定位问题
这时候我们需要进行网络抓包,但是Pod 内一般不会按照tcpdump,甚至都不会安装bash , sh等工具
那有没有什么办法可以直接通过宿主机抓取Pod网络数据包?
方案
一 . 手动进入
先查到pod所在节点 kubectl get po -n namespace podname -o wide
获取到主机ip后登陆到主机
执行以下操作:
代码语言:txt复制docker ps |grep podname
例如:
docker ps |grep nginx-66b87767fd-2jww9
1. 获取到docker id 之后
docker inspect -f '{{.State.Pid}}' contaienrid
2. 获取到pid之后进入到容器的网络命名空间
nsenter -n -t pid
3. 验证是否已经进入到了容器的网络命名空间
ip a
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
3: eth0@if60: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 62:47:5f:ef:62:d5 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.16.2.12/26 brd 172.16.2.191 scope global eth0
valid_lft forever preferred_lft forever
二. 使用脚本
脚本内容如下
代码语言:txt复制#!/usr/bin/env bash
function debug_net() {
set -eu
pod=`kubectl get pod ${pod_name} -n ${namespace} -o template --template='{{range .status.containerStatuses}}{{.containerID}}{{end}}' | sed 's/docker://(.*)$/1/'`
pid=`docker inspect -f {{.State.Pid}} $pod`
echo -e "