kubectl端口转发未绑定IPv4环回地址127.0.0.1



Ubuntu 20.04:上运行以下命令

kubectl port-forward -n some-namespace service/some-service 9900:5432

输出仅为:

Forwarding from [::1]:9900 -> 5432

也就是说,它只是从IPv6环回地址转发,而不是IPv4。

已验证此问题与防火墙规则无关。

原因可能是什么?

您可以尝试以下操作:

kubectl port-forward --address 0.0.0.0 service/<service-name> 9900:5432

kubectl port-forward --address 127.0.0.1 service/<service-name> 9900:5432

如果您只对localhost地址上的端口转发感兴趣。

更新:

正如我在评论中提到的:

netstat -ntlp | grep 9900

会告诉你这个端口是否已经在使用,但如果你尝试上面的例子,你也会得到同样的信息。

让我用一个简单的例子来解释一下这里到底发生了什么。

为了说明这一点,我部署了一个简单的nginxpod,并通过ClusterIP服务公开了它。

如果我现在尝试运行kubectl port-forward,一切都如预期:

$ kubectl port-forward -n default service/static-web 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

但是,让我们打开一个新的选项卡并运行netcat,它将在端口8080:上侦听

nc -l 8080

如果我们现在尝试运行kubectl port-forward,结果与您的示例中的结果相似:

$ kubectl port-forward -n default service/static-web 8080:80
Forwarding from [::1]:8080 -> 80

即只使用IPv6,并且没有错误消息。为什么会发生这种情况?如果您没有在kubectl port-forward命令中明确指定地址,它将尝试使用可用的地址。只要能够成功绑定到IPv6环回,就可以成功执行port-forward操作,并且不会出现错误消息。

然而,如果我们明确指定我们只对使用IPv4感兴趣,我们会看到一个非常描述性的错误,告诉我们到底发生了什么:

$ kubectl port-forward --address 127.0.0.1 -n default service/static-web 8080:80
Unable to listen on port 8080: Listeners failed to create with the following errors: [unable to create listener: Error listen tcp4 127.0.0.1:8080: bind: address already in use]
error: unable to listen on any of the requested ports: [{8080 80}]

正如您所看到的,它还告诉我们端口8080已经在使用:

[unable to create listener: Error listen tcp4 127.0.0.1:8080: bind: address already in use]

因此,端口9900已经在使用中。解决这个问题:

运行:

netstat -ntlp | grep 9900

找到在该端口上侦听的进程的PID,并通过运行来终止它

kill -9 <PID>

现在它应该起作用了。

相关内容

  • 没有找到相关文章

最新更新