使用nsenter调试k8s网络
nsenter是一个命令行工具, 可以进入进程的名称空间中。例如,如果一个容器以非 root 用户身份运行,使用 docker exec 进入其中后,发现该容器没有安装 sudo 或未 netstat ,并且您想查看其当前的网络属性,如开放端口,这种场景下将如何做到这一点?nsenter 就是用来解决这个问题的。nsenter(namespace enter)可以在容器的宿主机上使用 nsente
·
我是一个目录
一、 nsenter介绍
nsenter是一个命令行工具, 可以进入进程的名称空间中。例如,如果一个容器以非 root 用户身份运行,使用 docker exec 进入其中后,发现该容器没有安装 sudo 或未 netstat ,并且您想查看其当前的网络属性,如开放端口,这种场景下将如何做到这一点?nsenter 就是用来解决这个问题的。
nsenter(namespace enter)可以在容器的宿主机上使用 nsenter 命令进入容器的命名空间,以容器视角使用宿主机上的相应网络命令进行操作。当然需要拥有 root 权限。
nsenter 的 c 使用语法为,nsenter -t pid -n ,-t 接进程 ID 号,-n 表示进入名称空间内,为执行的命令。
二、实战
首先确定 Pod 名称和所在的节点:
kubectl -n ns-v3-fi-dev get pod -o wide | grep vip1web
vip1web-588bf7c5dc-p6fbl 172.20.199.54
vip1web-rpt-59868cc5fb-72jp4 172.20.199.54
vip1web-upgrad-5bbb8fcd84-6mk6c 172.20.199.54
排查目标:vip1web-588bf7c5dc-p6fbl 的tcp 1521的连接
提前准备了脚本,用于获取pod的pid:
vim get_pod_pid.sh
#!/bin/bash
list=$(docker ps -f 'status=running' |grep -v /pause |awk '{print $1}' |grep -v CONTAINER)
for i in $list
do
pid=$(docker inspect -f {{.State.Pid}} $i)
cantainer_name=$(docker inspect -f '{{index .Config.Labels "io.kubernetes.pod.name"}}' $i)
echo $pid " " $cantainer_name
done
上传到脚本中心
登录宿主机172.20.199.54,执行命令,获得pod的pid:
curl -s http://xxx.xxx.com/k8s/get_pod_pid.sh | sh | grep vip1web-588bf7c5dc-p6fbl
60935 vip1web-588bf7c5dc-p6fbl
最后执行命令:
nsenter -t 60935 -n netstat -anp | grep 1521
更多推荐
已为社区贡献1条内容
所有评论(0)