为什么主机端口在主机上的netstat输出中没有显示?

3

我使用kubectl和yaml文件创建了目标pod,发现进程在pod中按预期侦听目标端口。

令人惊讶的是,在主机上的netstat -tunlpnetstat -alpnetstat -an输出中看不到该端口。但是如果我尝试telnet localhost targetPort,它确实能正常工作!

为什么会这样?有人可以解释一下吗?

5个回答

2
这是因为使用了 docker。默认情况下,docker 不会将容器网络命名空间添加到 Linux 运行时数据(/var/run 挂载在 /run 上的 tmpfs),这也是当您运行 ip netns 命令时所看到的内容。
要查看网络命名空间,您需要使用 nsenter
  1. 获取容器 ID。
docker ps

获取容器进程的ID。
docker inspect --format '{{ .State.Pid }}' <<container-id>>
  1. 现在使用nsenter来显示Pod的网络空间。使用nsenter相比于docker exec的优势在于,nsenter可以让您在Pod内部执行所有可用的工具或命令,而docker exec只允许有限或受限制的命令。
nsenter -t <<container pid>> -n netstat -tunlp 


1
为了在工作节点上访问服务,您必须使用 NodePort 类型的服务将 Pod 暴露在工作节点上。运行在 Pod 内部的进程位于不同的网络命名空间中。您可以从 Pod 内部访问应用程序,但是如果没有服务对象,则无法从节点访问。请参见以下内容进行参考:
$ kubectl create deploy nginx --image=nginx
$ kubectl expose deploy nginx --target-port 80 --port 80 --type NodePort
$ NODE_PORT=$(kubectl get svc nginx -ojsonpath='{ .spec.ports[0].nodePort }')
$ netstat -an | grep $NODE_PORT
tcp46      0      0  *.31563                *.*                    LISTEN     

$ curl localhost:$NODE_PORT
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

HTH


1
nsenter -t <container-PID> -n netstat -nltp

这个命令显示容器端口,而不是主机端口,目前还没有回答这个问题。

1

由于容器内的容器在其自己的网络命名空间中运行,因此 netstat 无法检测到它们。

要列出容器内正在侦听的端口,请使用 nsenter。该工具将帮助您在进程的不同命名空间上执行命令(在我们的情况下是所需容器的 PID)。

  1. 获取容器的 PID - SSH 进入 K8s 工作节点并运行 docker inspect <containerid>(如果 docker 是您的容器运行时)

然后,在从上述命令中获取 PID 后运行以下命令:

  1. $ nsenter -t <container-PID> -n netstat -nltp

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接