Kubernetes 是一种流行的容器编排平台,用于管理容器化应用程序。网络是任何 Kubernetes 集群的重要组成部分,经常会出现需要进行故障排除的问题。可以帮助解决网络问题的一种工具是 nsenter。
nsenter 是一个 Linux 实用程序,允许你输入其他进程的名称空间。在 Kubernetes 集群中,每个 pod 都有自己的网络命名空间,这意味着你可以使用它 nsenter 进入 pod 的网络命名空间,并从 pod 的主机节点排查网络问题。
这在 pod 没有可执行的 shell 的情况下或在你可能无法访问网络实用程序 pod 以进行故障排除的环境中非常有用。
一个最典型的用途就是进入容器的网络命令空间。相当多的容器为了轻量级,是不包含较为基础的命令的,比如说 ip address,ping,telnet,ss,tcpdump 等等命令,这就给调试容器网络带来相当大的困扰:只能通过 docker inspect ContainerID 命令获取到容器 IP,以及无法测试和其他网络的连通性。这时就可以使用 nsenter 命令仅进入该容器的网络命名空间,使用宿主机的命令调试容器网络。
场景:无法连接到服务
如果你无法连接到 Kubernetes 集群中运行的服务,你可以使用 nsenter pod 的主机节点来解决问题。就是这样:
-
识别运行该服务的 pod。你可以使用该 kubectl get pods 命令列出集群中的所有 pod 及其当前状态。
-
通过
docker inspect -f {{.State.Pid}} container_id
确认容器的 PID。 -
确定 PID 后,使用 nsenter 命令输入容器的网络命名空间。网络命名空间位于/proc/{PID}/ns/net. 例如,nsenter -t {PID} -n。
-
进入容器的网络命名空间后,你可以使用标准网络工具(例如 ping、curl 或 telnet)来测试与服务的连接。