首页 > 首页 > 虚拟化 > 容器技术 > Kubernetes > 【原创】详解k8s Pod内使用宿主机命令排障
2026
04-27

【原创】详解k8s Pod内使用宿主机命令排障

Pod内使用宿主机命令意义

在Kubernetes集群中,一个复杂的微服务架构通常由多个Pod组成。当出现故障时,可能是由于网络问题、应用程序错误或其他原因导致的。在这种情况下,需要使用各种排查命令,深入了解Pod内部的通信和交互情况,以便更快速地诊断和解决问题。但是pod内一般都缺少排障命令,且安装不方便,这时候就需要我们使用宿主机的上的命令在pod中操作。

例如,在如果在宿主机上抓包,它抓取的是当前宿主机上所有的网络数据包,当然也包括Pod和其他Pod的,那就很难区分出我想抓取的那个Pod的数据包。但是在pod中使用tcpdump 命令抓包,能更加准确的分析网络故障问题。

如何在Pod内执行宿主机命令

1、确定要执行命令的pod 容器ID

我们先要查看Pod的容器ID,可以通过下面的命令进行获取该容器的ID

# kubectl get pod test1-pre-pre-c576689f5-ddf62 -o yaml | grep containerID - containerID: docker://f3cfee2a202cbf06f5c8449ba582e6154679c0a12ab1454a7778952dd2f4a73d

这个pod 容器IP是:f3cfee2a202cbf06f5c8449ba582e6154679c0a12ab1454a7778952dd2f4a73d ,当然我们只取前几位数字即可,如:f3cfee

2、确定pod容器所在的 node节点

# kubectl get pod test1-pre-pre-c576689f5-ddf62 -o wide

【原创】详解k8s Pod内使用宿主机命令排障 - 第1张  | 架构迷

上面NODE显示的就是容器所在的宿主机IP地址,假设是1.1.1.1

3、获取容器的Pid

登录宿主机1.1.1.1,执行如下命令获取容器的pid,用于后续pod内操作

# docker inspect -f '{{.State.Pid}}' f3cfee

32486

上面的 32486 就是我们需要的pid

4、使用nsenter 进入命名空间

nsenter 是一个进入命名空间的工具,可以进入某个命名空间进行修改,查看里面的进程和一些资源,我们要利用这个工具,进入到容器的网络命名空间里面执行命令。

若系统没nsenter 命令,执行如下命令安装下 nsenter工具

# yum -y install util-linux.x86_64

不知道nsenter的具体用法,可以通过如下命令查看

# nsenter -help

通过执行如下命令进入该容器的网络命名空间
# nsenter -n -t 32486

-n:是指定网络的命名空间
-t:是指定容器Pid

上面命令执行完成后,我们会进入容器中,查看ip可以看到确实是pod容器内部:

【原创】详解k8s Pod内使用宿主机命令排障 - 第2张  | 架构迷

接下来我们就可以在顺利执行宿主机上的命令了,如 tcpdump -w output.cap

最后编辑:
作者:摘星怪
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。