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

上面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容器内部:

接下来我们就可以在顺利执行宿主机上的命令了,如 tcpdump -w output.cap
- 本文固定链接: http://www.jiagou.cc/1792/
- 转载请注明: 摘星怪 于 架构迷 发表
