拨号 TCP <远程 IP>:6379: 连接: 连接被拒绝

我正在 GKE(谷歌库伯内特斯引擎)上构建一个应用程序,以及一个使用 GCE Redis 实例的系统。当我尝试从 GKE 上的应用程序容器连接到 GCE 上的 Redis 时,连接被拒绝了。() 应用程序是用 Go 编写的,而重用库是 go-redis(v8)。为什么我无法连接?dial tcp <REMOTE-IP>:6379: connect: connection refused


连接部分和发生错误的部分的源代码如下所示。


    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)

主机名已解析,因此它不是 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.


大话西游666
浏览 302回答 1
1回答

肥皂起泡泡

我断言容器中的每个应用程序都将具有相同的第 4 层(对于 redis、TCP)对网络的访问权限。由于 Redis 不提供重要的访问控制,这意味着如果容器上的一个应用程序具有对 redis 服务器的网络访问权限,则同一容器上的所有其他应用程序也将具有访问权限。如果一个人无法联系到redis,另一个人也不会联系。在同一容器上。这就是测试变得棘手的地方,因为在这里重现你的k8和gke配置是没有帮助或可行的。国际移徙方案平数和 tcp/6379 是不同的。仅仅因为ping工作,并不意味着Redis可以,反之亦然。不同的容器在 k8 和 gke 中将具有不同的网络访问权限。在应用容器上执行此测试,以从等式中取出所有可能的内容。apk add redis只拉入几个包,只有8MB,并在我测试时提供,但你不需要任何客户端应用程序来redis;它很简单,可以用网猫来完成。您也不必发出有效的 redis cmd - 如果您收到响应,您就知道网络工作正常:redis-cli-ERR unknown command/ # echo "hi, redis!" |nc localhost 6379-ERR unknown command `hi,`, with args beginning with: `redis!`,如果它在那里工作而不是在Go中工作,那可能是因为环境变量设置不正确。因此,您可能还想在命令行中对其进行测试。REDIS_SERVERnc $REDIS_SERVER 6379
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go