dial tcp <REMOTE-IP>:6379: connect: 连接被拒绝

Posted

技术标签:

【中文标题】dial tcp <REMOTE-IP>:6379: connect: 连接被拒绝【英文标题】:dial tcp <REMOTE-IP>:6379: connect: connection refused 【发布时间】:2021-11-21 06:00:09 【问题描述】:

我正在 GKE(Google Kubernetes Engine)和使用 Redis 的 GCE 实例的系统上构建应用程序。 当我尝试从 GKE 上的应用程序 pod 连接到 GCE 上的 Redis 时,连接被拒绝。(dial tcp &lt;REMOTE-IP&gt;:6379: connect: connection refused) 该应用程序是用 Go 编写的,redis 库是 go-redis(v8)。 为什么我无法连接?

连接部分和出错部分的源码如下。

    redisServerName = os.Getenv("REDIS_SERVER") // "sample.com:6379"
    redisClient = redis.NewClient(&redis.Options
        Addr:     redisServerName,
        Password: "",
        DB:       0,
    )

    p, err := redisClient.Ping(ctx).Result()
    log.Println(p, err)

hostname被解析,所以不是DNS问题,redis-cli命令是可执行的,所以好像不是防火墙问题。

#  redis-cli -h <REMOTE_IP> ping
PONG

后记

这是在 Go 应用程序运行的情况下从 Pod 运行命令的结果

/# redis-cli -h redis.sample.com
redis.sample.com:6379>   // can connect

/# nc redis.sample.com 6379
// There is NO response.

【问题讨论】:

这里的调试细节是关于 K8s 配置的。您是否在运行 Go 的确切容器上运行了 redis-cli 感谢您的评论。我将 redis-cli 作为调试 pod 部署并运行。 (运行 Go 的环境是 alpine,所以安装 redis 有点麻烦......) ping 命令(不是 redis-cli)确实与运行 Go 的 alpine 环境通信。我这样做是为了确定问题出在 GCP 网络环境还是 go-redis 库上。 ↑ 网络好像可以通讯,所以我以为是库的问题.. 【参考方案1】:

我断言容器中的每个应用程序都将具有相同的第 4 层(对于 redis、TCP)访问网络。由于 Redis 没有提供重要的访问控制,这意味着如果您容器上的一个应用程序可以访问 Redis 服务器,那么同一容器上的所有其他应用程序也可以。如果一个人不能联系redis,那么另一个人也不能。

在同一个容器上。这就是测试变得棘手的地方,因为在这里重现您的 k8s 和 gke 配置没有帮助或不可行。

ICMP Ping 和 tcp/6379 不同。仅仅因为 ping 有效,并不意味着 Redis 可以,反之亦然。而且不同的容器在k8s和gke中会有不同的网络访问。

app 容器上进行此测试,以排除所有可能的情况。

apk add redis只拉了几个包,只有8MB,我测试的时候提供redis-cli,但是redis不需要任何客户端应用;这很简单,可以使用 netcat .您也不必发出有效的 redis cmd - 如果您收到 -ERR unknown command 响应,您就知道网络正常:

/ # echo "hi, redis!" |nc localhost 6379
-ERR unknown command `hi,`, with args beginning with: `redis!`,

如果它在那里工作而不在 Go 中工作,可能是因为环境变量 REDIS_SERVER 设置不正确。因此,您可能还想在命令行中测试 那个

nc $REDIS_SERVER 6379

【讨论】:

感谢您的回复。你是对的,我也尝试安装netcat命令和redis-cli来调试。我发现使用redis-cli可以建立连接,使用netcat,我没有得到任何响应。 (命令执行的结果会在正文中添加。) 我会再做一些调试,然后批准它! NewClient() init() 函数是问题所在。并将其移至 main() 解决了该问题。使用 nc 命令进行调试并查看 redis 日志非常有帮助。非常感谢。

以上是关于dial tcp <REMOTE-IP>:6379: connect: 连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

遇到的错误是: dial tcp [::1]:3000: getsockopt: connection denied

问题解决:dial tcp 172.217.160.81:443: connect: connection refused

K8s Get "http://127.0.0.1:10252/healthz": dial tcp

[kubernetes]Calico运行异常:dial tcp 10.96.0.1:443: connect: connection refused

对主机 https://gitlab.host.com 的 SSH 密钥扫描失败,错误:dial tcp:lookup tcp///gitlab.host.com:getaddrinfow: The

dial tcp: lookup xxx.xxx.xxx.xxx: no such host