![](/img/trans.png)
[英]Error occured with redis HMSEET, dial tcp :6379: connect: connection refused
[英]dial tcp <REMOTE-IP>:6379: connect: connection refused
我正在 GKE(Google Kube.netes 引擎)上構建一個應用程序和一個使用 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 命令是可執行的,所以看起來不是 Firewall 的問題。
# 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.
我斷言容器中的每個應用程序都將具有相同的第 4 層(對於 redis,TCP)訪問 .network。 由於 Redis 不提供重要的訪問控制,這意味着如果您容器上的一個應用程序具有對 redis 服務器的網絡訪問權限,則同一容器上的所有其他應用程序也將如此。 如果一個人無法聯系 redis,另一個人也不會。
在同一個容器上。 這是測試變得棘手的地方,因為在此處重現您的 k8s 和 gke 配置沒有幫助或不可行。
ICMP Ping 和 tcp/6379 不同。 僅僅因為 ping 有效,並不意味着 Redis 可以,反之亦然。 而且不同的容器在k8s和gke中會有不同的.network訪問權限。
在應用程序容器上進行此測試,以排除一切可能。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.