Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 为什么主机的Netstat输出中不显示HostPort_Docker_Ubuntu_Kubernetes_Kubectl - Fatal编程技术网

Docker 为什么主机的Netstat输出中不显示HostPort

Docker 为什么主机的Netstat输出中不显示HostPort,docker,ubuntu,kubernetes,kubectl,Docker,Ubuntu,Kubernetes,Kubectl,我使用kubectl和yaml文件来创建目标pod,发现pod中的进程正在按预期侦听目标端口 令我惊讶的是,在主机的netstat-tunlp或netstat-alp或netstat-an的输出中看不到该端口。但如果我尝试telnet localhost targetPort,它会工作 为什么会发生这种情况??有人能解释一下吗?为了访问工作节点上的服务,您必须使用类型为的服务公开工作节点上的pod。POD中运行的进程位于不同的网络命名空间中。您可以从pod内部访问应用程序,但不能从没有服务对象的

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

令我惊讶的是,在主机的netstat-tunlp或netstat-alp或netstat-an的输出中看不到该端口。但如果我尝试telnet localhost targetPort,它会工作


为什么会发生这种情况??有人能解释一下吗?

为了访问工作节点上的服务,您必须使用类型为的服务公开工作节点上的pod。POD中运行的进程位于不同的网络命名空间中。您可以从pod内部访问应用程序,但不能从没有服务对象的节点访问。参见以下参考:

$kubectl创建部署nginx-image=nginx $kubectl公开部署nginx-目标端口80-端口80-类型节点端口 $NODE_PORT=$kubectl get svc nginx-ojsonpath='{.spec.PORT[0].nodePort}' $netstat-一个| grep$NODE_端口 tcp46 0 0*.31563*.LISTEN $curl localhost:$NODE\u端口 欢迎来到nginx! ...
HTH

为了访问工作节点上的服务,必须使用类型为的服务公开工作节点上的pod。POD中运行的进程位于不同的网络命名空间中。您可以从pod内部访问应用程序,但不能从没有服务对象的节点访问。参见以下参考:

$kubectl创建部署nginx-image=nginx $kubectl公开部署nginx-目标端口80-端口80-类型节点端口 $NODE_PORT=$kubectl get svc nginx-ojsonpath='{.spec.PORT[0].nodePort}' $netstat-一个| grep$NODE_端口 tcp46 0 0*.31563*.LISTEN $curl localhost:$NODE\u端口 欢迎来到nginx! ...
HTH

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

要列出侦听容器内部的端口,请使用nsenter。这个工具将帮助您在不同的进程名称空间上执行命令,在我们所需容器的例子中

在K8s工作节点上获取container-SSH的PID,如果docker是您的容器运行时,则运行docker inspect 并且,从上面的命令获取PID后,运行

$nsenter-t-n netstat-nltp
由于pod中的容器在它们自己的网络名称空间中运行,因此netstat无法检测它们

要列出侦听容器内部的端口,请使用nsenter。这个工具将帮助您在不同的进程名称空间上执行命令,在我们所需容器的例子中

在K8s工作节点上获取container-SSH的PID,如果docker是您的容器运行时,则运行docker inspect 并且,从上面的命令获取PID后,运行

$nsenter-t-n netstat-nltp 这是因为docker。默认情况下,docker不会将容器网络名称空间添加到linux运行时数据/var/run中,该数据作为tmpfs from/run装入,这是您在运行ip netns命令时看到的

要查看网络名称空间,需要使用nsenter

获取容器id。 获取容器进程id。 这是因为docker。默认情况下,docker不会将容器网络名称空间添加到linux运行时数据/var/run中,该数据作为tmpfs from/run装入,这是您在运行ip netns命令时看到的

要查看网络名称空间,需要使用nsenter

获取容器id。 获取容器进程id。 此命令显示容器端口,而不是主机端口,现在仍然回答问题


此命令显示容器端口,而不是主机端口,现在仍然回答以下问题

传入连接可能使用iptable规则直接路由到k8s网络,例如使用Calico CNI时

你可以试试

iptable -L -t nat
看看你的主机端口是否在那里

请参见此处的说明:


传入连接可以使用iptable规则直接路由到k8s网络,例如使用Calico CNI时

你可以试试

iptable -L -t nat
看看你的主机端口是否在那里

请参见此处的说明:

nsenter -t <<container pid>> -n netstat -tunlp 

nsenter -t <container-PID> -n netstat -nltp
iptable -L -t nat