【发布时间】: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 库上。
-
↑ 网络好像可以通讯,所以我以为是库的问题..