kubernetes kubectl端口转发超时问题

zlwx9yxi  于 2023-02-03  发布在  Kubernetes
关注(0)|答案(6)|浏览(365)

当使用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

希望能保持联系

lb3vh1jj

lb3vh1jj1#

将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在连接丢失时重新连接

tkclm6bt

tkclm6bt2#

似乎存在5分钟的超时,可以使用kubelet参数覆盖:
https://github.com/kubernetes/kubernetes/issues/19231
如果您想将超过5分钟(或无限制)的时间传递到您的kubelets,您可以指定streaming-connection-idle-timeout。例如,--streaming-connection-idle-timeout=4h将其设置为4小时。或者:--streaming-connection-idle-timeout=0以使其不受限制。(已弃用:这个参数应该通过Kubelet的--config标志指定的配置文件来设置。更多信息请参见https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/

wvt8vs2t

wvt8vs2t3#

我通过保持连接活动来解决这个问题,例如使用curl或nc。
转发端口:

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

在另一个终端中,通过每10秒访问一次端口来保持连接处于活动状态:

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

qgzx9mmu4#

窗上有 bat (上帝原谅我)

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

pnwntuvh5#

如果您在负载平衡器(如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(如果您的环境允许的话)。

rslzwgfq

rslzwgfq6#

下面是我使用的一个bash函数,用于绕过端口转发的超时问题:

function pfpod(){
pod=$1
portloc=$2
portrem=$3
while true
  do
    podname=`kubectl get pods -o name | awk -F'/' '{print $2}'| grep "$pod"| head -1`
    kubectl port-forward $podname $portloc:$portrem
done
}

我已经添加了一个kubectl调用来匹配部分pod名称,如果你有很多pod要部署,你可以只提供部分名称,然后使用顶部的pod。否则你也可以提供完整的pod名称。
样本使用:
pfpodElasticSearch9201 9200

相关问题