一、 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  
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐