netstat显示外部端口为kubernetes:port。这是什么意思?

32

我正在使用 Windows 10 Pro 电脑。

当我运行 netstat 命令时,它显示活动连接中的 kubernetes:port 是外部地址。

这是什么意思?我已经检查过了,我的电脑上没有在运行 Kubernetes 集群。

我该如何关闭这些连接?

图片描述

Minikube 状态:

$ minikube status
host:
kubelet:
apiserver:
kubectl:

请问您为什么添加了 minikube 标签并表示您的机器上没有 Kubernetes 集群? - Vit
我安装了minikube来运行kubernetes,然后使用它停止了minikube和k8s集群。这就是我提到的原因。 - Shubham Chadokar
minikube status 命令的输出是什么? - mario
我已经编辑了问题并附上了minikube的状态。 - Shubham Chadokar
3个回答

43
因为netstat渲染输出的方式,导致出现这种情况,与Kubernetes实际无关。
我在Windows上安装了Docker Desktop,并将其添加到主机文件中:
# Added by Docker Desktop
192.168.43.196 host.docker.internal
192.168.43.196 gateway.docker.internal
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
# End of section

有一条记录将127.0.0.1映射到kubernetes.docker.internal。当netstat呈现其输出时,它会解析外部地址,并查看主机文件并查看此记录。它显示kubernetes,这就是你在控制台上看到的内容。您可以尝试更改它为

127.0.0.1 tomato.docker.internal

通过这样,netstat会打印:

  Proto  Local Address          Foreign Address        State
  TCP    127.0.0.1:6940         tomato:6941            ESTABLISHED
  TCP    127.0.0.1:6941         tomato:6940            ESTABLISHED
  TCP    127.0.0.1:8080         tomato:40347           ESTABLISHED
  TCP    127.0.0.1:8080         tomato:40348           ESTABLISHED
  TCP    127.0.0.1:8080         tomato:40349           ESTABLISHED

实际上发生的是本地主机之间建立了连接(netstat -b将显示创建它们的应用程序),与Kubernetes无关。


1
感谢详细的解释。我检查了主机文件,删除了Kubernetes引用,现在没有来自kube的外部主机了。 - Shubham Chadokar
netstat -b 为我解决了大问题。原来是 openvpn.exe 建立了一个名为 kubernetes:1099 的连接,这干扰了默认的 JMX 管理器。 - rupweb

8
似乎Windows docker更改了你的hosts文件。因此,如果你想摆脱这些连接,只需将hosts文件中相应的行注释掉即可。
在Windows 10上,hosts文件位于C:\Windows\System32\drivers\etc,并且记录可能看起来像127.0.0.1 kubernetes.docker.internal。我很确定这会干扰你的Windows上的docker服务(然而,我不是专家),因此不要忘记在需要恢复docker服务时取消注释这些行。

它不会消除实例或端口。他们现在称自己为cbs:XXXXXX。 我猜他们是与docker捆绑在一起的。奇怪的是,当Firefox被打开时,会出现更多这样的实例。这里有些可疑的事情。 - Nils Riga
我不想从hosts文件中删除docker的添加内容,所以我只是在hosts文件顶部添加了一行127.0.0.1 localhost,然后本地连接再次被系统正确识别。 - Travis Britz

1

好的,看起来你的minikube实例已经被删除。请记住,在Linux或其他nix-based系统中,许多进程使用网络套接字来彼此通信,例如您将看到许多已建立的连接,其中本地和外部地址均设置为localhost:

tcp        0      0 localhost:45402         localhost:2379          ESTABLISHED
tcp        0      0 localhost:45324         localhost:2379          ESTABLISHED
tcp        0      0 localhost:2379          localhost:45300         ESTABLISHED
tcp        0      0 localhost:45414         localhost:2379          ESTABLISHED
tcp        0      0 localhost:2379          localhost:45388         ESTABLISHED
tcp        0      0 localhost:40600         localhost:8443          ESTABLISHED

在你的情况中,kubernetes 只是你一台机器/虚拟机/实例的 hostname。也许你运行了 minikube 并将其称为 kubernetes,因此此主机名出现在你当前的活动网络连接中。基本上,它与运行kubernetes 集群无关。
为了更清晰地说明,你可以查看你的 /etc/hosts 文件的内容并查找条目 kubernetes,然后将它们与你的网络接口地址进行比较(运行 ip -4 a)。很可能 /etc/hosts 中的 kubernetes 条目映射到其中的一个地址上。
如果这能够解决你的疑问,请告诉我。

编辑:

我在我的Linux实例上使用Minikube复现了它,并注意到完全相同的行为,但看起来只有在成功执行minikube stop后才显示已建立的连接。在执行minikube delete后,它们会消失。看起来这些连接确实属于Kubernetes的各个组件,但由于某种原因未被终止。基本上,关闭已建立的网络连接是创建它们的应用程序的职责,而看起来minikube由于某种原因没有终止它们。

如果你运行:

sudo netstat -ntp ### important: it must be run as superuser

它另外显示了一个 PID/Program name 列,您可以在其中查看特定连接是通过哪个程序建立的。您会看到许多属于 etcdkube-apiserverESTABLISHED 网络连接。

首先,我尝试重新启动整个实例。它显然会关闭所有连接,但然后我验证了几次,看起来成功执行 minikube delete 也会关闭所有连接。

此外,您可能希望通过运行以下命令来检查可用的 Docker 容器:

docker ps

或者:

docker container ls

停止minikube实例后,它仍显示这些容器,看起来原因是某些kubernetes组件的大量连接仍然通过netstat命令显示出来。
但是在使用minikube delete命令后,既不再有容器,也不再有与kubernetes集群组件建立的ESTABLISHED连接。

好的,我会检查一下。我使用的是Windows 10专业版而不是Linux。 - Shubham Chadokar
1
是的,我知道,但如果你正在使用 minikubedocker desktop,它基本上使用某种虚拟化技术,在 Linux 操作系统之上运行你的 Docker 容器。 - mario
好的,所以你在Windows命令行PowerShell中运行netstat,对吧? - mario
请查看我的最后一次编辑。 - mario

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