在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
会告诉你这个端口是否已经在使用,但如果你尝试上面的例子,你也会得到同样的信息。
让我用一个简单的例子来解释一下这里到底发生了什么。
为了说明这一点,我部署了一个简单的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
命令中明确指定地址,它将尝试使用可用的地址。只要能够成功绑定到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>
现在它应该起作用了。