首页 > 解决方案 > 我如何在 GKE 中私下转发 cqlsh 的连接

问题描述

因此,我试图通过打开与 Kubectl 的连接来使用 cqlsh 连接到 GKE 中的我的 scylla 实例。然而,我遇到了一些我无法理解的奇怪问题。

我在 GKE 上运行 scylla,它基本上是一个 cassandra 仿冒品,应该比 cassandra 本身运行得更快。要访问 scylla,我希望能够使用 kubectl port-forward 命令连接到数据库,这样我就可以连接外部工具,例如 table plus。当我运行时,kubectl port-forward pod/scylla-0 -n scylla 9042我希望可以从本地计算机访问该端口,但是,当我尝试与 cqlsh localy 连接时,我收到以下错误消息:

from clqsh: Connection error: ('Unable to connect to any servers', {'127.0.0.1': ConnectionShutdown('Connection to 127.0.0.1 was closed',)})

from kubectl: E0520 17:12:12.522329      51 portforward.go:400] an error occurred forwarding 9042 -> 9042: error forwarding port 9042 to pod <some id>, uid : exit status 1: 2019/05/20 15:12:12 socat[998972] E connect(5, AF=2 127.0.0.1:9042, 16): Connection refused

我也尝试将服务直接转发到类似的结果

我个人认为这其中最奇怪的部分是,当我使用负载均衡器公开 scylla 时,我可以很好地连接到它,当我为 scylla 转发 JMX 端口时,我也可以使用 JConsole,这就是为什么我有这么多对此感到头疼。

标签: kubernetesgoogle-kubernetes-enginekubectlcqlshscylla

解决方案


它失败的原因是端口转​​发只绑定到本地主机(127.0.0.1)。如果你带着

kubectl exec -ti pod/scylla-0 -n scylla -- /bin/bash
yum install net-tools -y
netstat -nlup | grep scylla 

您会注意到 scylla 绑定到容器 pod IP 而不是 127.0.0.1,因此您会收到拒绝连接。

尝试: kubectl port-forward --address your_pod_ip pod/mypod 9042:9042

或者: kubectl port-forward --address your_service_ip service/myservice 9042:9042

我自己没有尝试过,但我认为它可以工作。请告诉我。


推荐阅读