問題狀況:
當(dāng)K8S遇到流量高峰時璧帝,經(jīng)常會報錯 “ php_network_getaddresses: getaddrinfo failed”,就是遇到了域名無法解析的情況富寿。
1 最先想到升配裸弦,因為問題總是伴隨著高流量產(chǎn)生,結(jié)果無效作喘。
2 后來阿里云的人提示是基礎(chǔ)鏡像Alpine的原因理疙,建議換CentOS。原來Alpine使用了musl泞坦,CentOS等Linux發(fā)行版使用的glibc窖贤,在實現(xiàn)DNS上不同。但我們換成CentOS贰锁,問題還是沒解決赃梧。
3 后來分析應(yīng)用裝在普通機器上沒問題,那應(yīng)該是K8S 解析DNS的組件出了問題豌熄。檢查系統(tǒng)級容器授嘀,發(fā)現(xiàn)coredns報了一堆錯,于是coredns升版本锣险,調(diào)高限制蹄皱,coredns不報錯了览闰,但依舊有DNS解析失敗。
4 實在沒辦法了巷折,把kube-system中的系統(tǒng)容器都調(diào)高限制压鉴,問題依舊。
解決過程:聯(lián)系阿里云的人锻拘,他們抓了幾天網(wǎng)絡(luò)包油吭,分析到了DNS丟包情況(好吧,這個就是我們的問題)署拟。最后在/var/log/messages里找到了關(guān)鍵信息
nf_conntrack: table full, dropping packet
一查婉宰,原來docker會調(diào)用nf_conntrack 連接跟蹤模塊。Linux為每個經(jīng)過內(nèi)核網(wǎng)絡(luò)棧的數(shù)據(jù)包推穷,生成一個新的連接記錄項心包,當(dāng)服務(wù)器處理的連接過多時,連接跟蹤表被打滿缨恒,服務(wù)器會丟棄新建連接的數(shù)據(jù)包。
需要調(diào)整3個參數(shù):
echo 262144 | sudo tee /sys/module/nf_conntrack/parameters/hashsize #調(diào)整net.netfilter.nf_conntrack_buckets
sudo sysctl net.netfilter.nf_conntrack_max=1048576
sudo sysctl net.netfilter.nf_conntrack_tcp_timeout_established=600
參考博文:
https://www.zybuluo.com/babydragon/note/255530
http://keithmo.me/post/2018/08/25/conntrack-tuning/