簡體   English   中英

撥打 tcp<remote-ip> :6379:連接:連接被拒絕</remote-ip>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM