nsenter命令解决容器内部命令不足排查网络的问题

在docker或者container中,为了尽可能缩减镜像大小,常常不会包含一些常用的工具,类似ping,curl,tcpdump等,虽然精简了镜像,但如果我们需要在容器内部测试网络联通性时,没有这些工具就非常的头疼。其实容器内部和主机之间的网络环境是互相隔离的,处于独立的命名空间下,那如果能在主机上切换命名空间,就可以在主机上以容器的网络环境进行操作,就可以利用主机上的工具,利用这个思想,我们就能够实现不用进入容器内部也可以实现容器内部一样的环境。这种需求的工具就是我们今天要介绍的nsenter。

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。

格式:nsenter [options] [program [arguments]]
参数详情:options:-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录

如果没有给出program,则默认执行$SHELL。

POD网络排查实战

1 可以先执行 kubectl get pods $PodName -n $NameSpace -o wide 看看pod运行的节点

2 登录到对应的node上

如果是docker运行时,执行 docker ps| grep $pod名称找到容器ID,然后在执行 docker inspect -f {{.State.Pid}} 容器id 找到容器的进程pid
如果是containerd, 使用命令:

yum -y install jq; crictl inspect $(crictl ps | grep crictl pods | grep $POD_NAME名称 | awk '{print$1}' | awk '{print$1}') | jq .info.pid

找到容器的进程pid

3 执行yum -y install util-linux.x86_64 安装下 nsenter工具,然后执行 nsenter --target 容器pid -n 进入到容器的网络名称空间

声明: 本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
Kubernetes

K8S中使用Ingress或者istio配置后端txt文件域名验证istio

2025-3-19 17:24:25

云原生

不应该选择 DevOps 方面工作的原因

2024-12-18 17:51:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索