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 <REMOTE-IP>: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