問題描述
在AKS Pod中連線 Azure Redis服務,大機率出現連線不上的問題。大多數的錯誤為 RedisConnectionException: Unable to connect to Redis server: xxxxxxxxx.redis.cache.chinacloudapi.cn/52.xxx.xxx.xxx:6380
, 但是有時候的錯誤資訊為: RedisConnectionException: Unable to init enough connections amount! only 6 of 24 were initialized. Redis server: xxxxxxxxx.redis.cache.chinacloudapi.cn/52.xxx.xxx.xxx:6380 。
所以,根據後面的資訊判斷,Pod並不是完全不能連線Reids伺服器,而是隻能成功建立部分連線,這是什麼問題呢?
問題解答
當出現連線Redis伺服器Timeout時,第一反應就是要檢視客戶端和服務端的網路是否連通,是否穩定。
所以進入到Pod所在的節點中,執行 paping 測試,驗證了問題在於 連線Redis伺服器6380的埠不穩定,經常出現Timeout。
paping -p 6380 xxxxxxxx.redis.cache.chinacloudapi.cn -c 10
結果如下:
證明了是因為AKS所在的網路與Azure Redis之間,存在連通性穩定問題。
進一步調查AKS的網路配置,使用的是預設標準版本的Azure Load Balancer。因為Load Balancer存在出口IP埠限制,預設一個節點的出口埠為1024個,如果節點中所建立的連線過多,佔用完SNAT埠數,就會導致新的連線連線不成功 Connection timed out.
(Source: https://docs.azure.cn/zh-cn/aks/load-balancer-standard#configure-the-allocated-outbound-ports)
透過調大預設的SNAT埠限制數後 (1024 ---> 8192), 連線Redis的問題得到解決。
## 長Ping結果也變得穩定。
參考資料
在 Azure Kubernetes 服務 (AKS) 中使用公共負載均衡器 : https://docs.azure.cn/zh-cn/aks/load-balancer-standard#configure-the-allocated-outbound-ports
使用 PSPING 測試連線 : https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-troubleshoot-connectivity#test-connectivity-using-psping