localhost - kubectl port-forward 未绑定(bind) IPv4 环回地址 127.0.0.1

标签 localhost port kubectl portforwarding ipv4

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

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

更新:

正如我在评论中提到的:

netstat -ntlp | grep 9900

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

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

为了说明这一点,我部署了一个简单的 nginx pod 并通过 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 命令中显式指定地址,它会尝试使用可用的地址。只要能够成功绑定(bind)到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]

关于localhost - kubectl port-forward 未绑定(bind) IPv4 环回地址 127.0.0.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65324538/

相关文章:

本地网络上的Mysql错误10061

mysql - 在子域上创建 MySQL 服务器

kubernetes - Kubectl 缺少 Terraform Cloud 形式

kubernetes - 如何从 pod 内部公开 kubernetes 度量服务器 api 以 curl ?

nginx - kubectl port-forward 不适用于 EC2 实例

localhost - 从互联网访问本地主机

c - 本地主机上的服务器似乎不接受连接

linux拒绝从本地主机打开监听端口

windows - 如何更改/查看 Windows 机器上的临时端口范围?

mysql - Rails 服务器未在 Rails 3.2.1 中启动