在 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/