为什么kubectl-forwad连接不能保持很长时间



我在谷歌云中有一个kubernetes集群。由于资源限制,我无法运行占用大量内存的应用程序。所以我在另一台云机器上运行该应用程序,并使用kubectl转发服务端口,这是我的kubectl转发脚本:

#!/usr/bin/env bash
set -u
set -e
set -x
namespace=reddwarf-cache
kubectl config use-context reddwarf-kubernetes
POD=$(kubectl get pod -l app.kubernetes.io/instance=cruise-redis -n ${namespace} -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward ${POD} 6380:6379 -n ${namespace}

我可以像这样从远程服务器连接kubernetes集群服务,本地应用程序连接到本地机器端口,kubectl会将连接转发到kubernete集群。但遗憾的是,我发现kubectl转发无法长时间保持稳定,当应用程序运行一段时间时,在未来的时间里总是会出现拒绝连接的错误。有可能解决这个问题吗?让我以稳定的方式连接到kubernetes集群服务?例如,当我端口转发redis连接时,它将在将来抛出以下错误:

E1216 11:58:43.452204    7756 portforward.go:346] error creating error stream for port 6379 -> 6379: write tcp 172.17.0.16:60112->106.14.183.131:6443: write: broken pipe
Handling connection for 6379
E1216 11:58:43.658372    7756 portforward.go:346] error creating error stream for port 6379 -> 6379: write tcp 172.17.0.16:60112->106.14.183.131:6443: write: broken pipe
Handling connection for 6379
E1216 11:58:43.670151    7756 portforward.go:346] error creating error stream for port 6379 -> 6379: write tcp 172.17.0.16:60112->106.14.183.131:6443: write: broken pipe
Handling connection for 6379

当我使用这个命令使用端口转发连接kubernetes集群的redis服务并执行一些命令时,会显示以下错误:

➜  ~ redis-cli -h 127.0.0.1 -p 6379 -a 'uoGTdVy3P7'
127.0.0.1:6379> info
Error: Connection reset by peer

我读过这个GitHub问题,似乎没有人知道发生了什么。

在您发布GitHub问题后,我偶然发现了一个可能对您有所帮助的解决方案。首先,让kubectl通过运行来决定使用哪个主机端口

kubectl port-forward ${POD} :6379 -n ${namespace}

然后,通过运行转发主机上的同一端口

kubectl port-forward ${POD} 6379:6379 -n ${namespace}

您可以做的另一件事是创建一个服务,将您想要的端口映射到redis Pods中的6379端口,例如服务文件如下所示:

apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: redis
ports:
- protocol: TCP
port: <port>
targetPort: 6379

应用服务资源。然后,创建由单个服务支持的Ingress,以使redis从集群外部可用,示例文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
spec:
defaultBackend:
service:
name: my-service
port:
number: <port>

应用Ingress资源并通过运行获取其IP地址

kubectl get ingress test-ingress

之后,使用Ingress IP地址检查来自另一台机器的redis连接。

最新更新