背景
工具介绍
nsenter 是一款可以进入进程的名称空间中。例如,如果一个容器以非 root 用户身份运行,而使用 docker exec
进入其中后,但该容器没有安装 sudo
或未 netstat
,并且您想查看其当前的网络属性,如开放端口,这种场景下将如何做到这一点?nsenter 就是用来解决这个问题的。
nsenter (namespace enter) 可以在容器的宿主机上使用 nsenter
命令进入容器的命名空间,以容器视角使用宿主机上的相应网络命令进行操作。当然需要拥有 root
权限
网络故障如何抓包 , 容器内部没有工具怎么办 ??
创建容器测试
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
获取容器ID
使用kubectl 命令获取ID
kubectl describe pod nginx-6799fc88d8-plddn
获取PID
拿到 container id 后,我们登录到 pod 所在节点上去获取其主进程 pid。
获取节点 kubectl get pod -owide
containerd 运行时使用 crictl 命令获取:
crictl inspect 0f38cad42b7e99bc2509a04c3da80c8dbec980d45e0b6f64c2191a5e4ce9ceec | grep -i pid
dockerd 运行时使用 docker 命令获取:
docker inspect 0f38cad42b7e99bc2509a04c3da80c8dbec980d45e0b6f64c2191a5e4ce9ceec | grep -i pid
nsenter 进入容器netns
在对应pod 的节点执行一下命令 ip a 查看是否进入容器
nsenter -n --target 5432
抓包
tcpdump -i eth0 host 10.244.234.106 -nn
后面会详细介绍tcpdump 使用