我使用kubectl和yaml文件创建了目标pod,发现进程在pod中按预期侦听目标端口。
令人惊讶的是,在主机上的netstat -tunlp
或netstat -alp
或netstat -an
输出中看不到该端口。但是如果我尝试telnet localhost targetPort,它确实能正常工作!
为什么会这样?有人可以解释一下吗?
我使用kubectl和yaml文件创建了目标pod,发现进程在pod中按预期侦听目标端口。
令人惊讶的是,在主机上的netstat -tunlp
或netstat -alp
或netstat -an
输出中看不到该端口。但是如果我尝试telnet localhost targetPort,它确实能正常工作!
为什么会这样?有人可以解释一下吗?
docker
。默认情况下,docker 不会将容器网络命名空间添加到 Linux 运行时数据(/var/run 挂载在 /run 上的 tmpfs),这也是当您运行 ip netns
命令时所看到的内容。nsenter
。
docker ps
docker inspect --format '{{ .State.Pid }}' <<container-id>>
nsenter
相比于docker exec
的优势在于,nsenter可以让您在Pod内部执行所有可用的工具或命令,而docker exec
只允许有限或受限制的命令。nsenter -t <<container pid>> -n netstat -tunlp
$ 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
nsenter -t <container-PID> -n netstat -nltp
由于容器内的容器在其自己的网络命名空间中运行,因此 netstat
无法检测到它们。
要列出容器内正在侦听的端口,请使用 nsenter
。该工具将帮助您在进程的不同命名空间上执行命令(在我们的情况下是所需容器的 PID)。
docker inspect <containerid>
(如果 docker 是您的容器运行时)然后,在从上述命令中获取 PID 后运行以下命令:
$ nsenter -t <container-PID> -n netstat -nltp
传入连接可以直接使用iptables规则路由到k8s网络中(例如,当使用Calico CNI时)。
你可以尝试。
iptable -L -t nat
并查看您的主机端口是否出现在那里。
在此处查看说明:
https://www.reddit.com/r/kubernetes/comments/kne734/help_demystify_hostport_networking_please/