kubectl端口转发超时问题

时间:2017-11-25 09:12:27

标签: kubernetes kubectl

使用kubectl端口转发功能时,我能够成功将本地端口转发到远程端口。然而,似乎在几分钟空转后,连接被丢弃。不知道为什么会这样。

以下是用于移植的命令:

kubectl --namespace somenamespace port-forward somepodname 50051:50051

错误讯息:

Forwarding from 127.0.0.1:50051 -> 50051
Forwarding from [::1]:50051 -> 50051
E1125 17:18:55.723715    9940 portforward.go:178] lost connection to pod

希望能够保持连接

5 个答案:

答案 0 :(得分:10)

似乎可以使用kubelet参数覆盖5分钟超时:

https://github.com/kubernetes/kubernetes/issues/19231

  

如果您想将超过5分钟(或无限制)的内容传递到您的kubelet,您可以指定streaming-connection-idle-timeout。例如。   --streaming-connection-idle-timeout=4h将其设置为4小时。要么:   --streaming-connection-idle-timeout=0使其无限制。

答案 1 :(得分:7)

将kube的streaming-connection-idle-timeout设置为0应该是正确的解决方案,但是如果您不想更改任何内容,则可以使用while-do构造

格式:while true; do <<YOUR COMMAND HERE>>; done

因此,只需在CLI中输入:while true; do kubectl --namespace somenamespace port-forward somepodname 50051:50051; done即可保持kubectl在连接断开时重新连接

答案 2 :(得分:6)

在Windows上做这样的蝙蝠(上帝原谅我)

:1
oc port-forward PODNAME 8003:8080
goto 1

答案 3 :(得分:6)

我通过保持连接活动来解决此问题,例如使用curl或nc。

转发端口:

kubectl --namespace somenamespace port-forward somepodname 50051:50051

在另一个终端中,每10秒与端口连接一次,以保持连接状态:

while true ; do nc -vz 127.0.0.1 50051 ; sleep 10 ; done

答案 4 :(得分:0)

如果您在负载均衡器(如 HAProxy)后面运行 Kubernetes 集群,则 kubelet 中配置的超时可能会大于 HAProxy 中配置的超时。

例如 Kubelet 中的 streamingConnectionIdleTimeout 设置默认为 4h:

$ kubectl proxy --port=8001 &
$ NODE_NAME="XXXX"; curl -sSL "http://localhost:8001/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig|.kind="KubeletConfiguration"|.apiVersion="kubelet.config.k8s.io/v1beta1"' | grep streaming
  "streamingConnectionIdleTimeout": "4h0m0s",

但如果在 HAProxy(或您首选的 LB)中,您有以下设置:

defaults
  timeout client 1m
  timeout server 1m
...

如果您在应用上没有任何活动,尝试执行端口转发将超时:

$ date; kubectl port-forward service/XXXX 1234:80
Mon Jul  5 10:58:20 CEST 2021
Forwarding ...
# after a minute
E0705 10:59:21.217577   64160 portforward.go:233] lost connection to pod

为了解决这个问题,一个解决方案是增加超时时间(注意这一点,因为根据您的集群,它可能会产生不良影响)或在直接连接到 API 服务器的端口转发时绕过 LB(如果您的环境允许的话)。