問題描述
- 測試環境中服務在內網調用其他服務時偶爾出現5秒卡頓,但是在外部網絡調用不會出現卡頓;
- 測試環境中訪問外網,偶現解析域名失敗;
調查過程
內網訪問出現卡頓
- 對服務自身以及調用目標進行打點計時,發送方接收響應式出現卡頓,目標服務正常;
- 對網關以及Nginx進行打點計時,均未出現超時;
- 由於外網訪問正常而內網不正常,排除網絡傳輸問題;
- 外網訪問與內網的區別是URL不同以及DNS解析所獲取的ip不同,但是實際上接受最終接受請求的都是Nginx,所以嘗試跳過DNS解析直接訪問ip,成功解決卡頓現象.
訪問外網域名解析失敗
- 對請求域名進行抓包分析;
- 根據抓包返回結果定位到問題出現在CoreDns獲取外部服務ip失敗.
解決方案
內網訪問出現卡頓
CoreDns在解析域名的時候回去嘗試獲取ipv6的地址,在默認情概況下獲取ipv6有可能會出現卡頓現象,設置爲快速模式之後相當於對獲取ipv6地址過程增加了一個超時限制,ipv6解析不存在的時候會快速的返回並嘗試ipv4的解析
修改coredns 的配置增加ipv6解析快速解析
template ANY AAAA {
rcode NXDOMAIN
}
訪問外網域名解析失敗
在k8s集羣內部想要訪問外網需要從CoreDns統一獲取DNS解析,默認情況下會使用forward模式,兩種模式的區別:
forward:轉發域名查詢到上游DNS服務器;
proxy:轉發特定的域名查詢到多個其他DNS服務器,同時提供多個DNS服務器的負載均衡功能.
修改coredns 的配置,將forward 換成proxy
proxy . /etc/resolv.conf