前言:
將服務(wù)與集群遷移到新的服務(wù)器上后,出現(xiàn)了一個(gè)故障,訪問容器無法訪問到大量數(shù)據(jù)。訪問單行數(shù)據(jù)是可以實(shí)現(xiàn)的,而大量數(shù)據(jù)再本地,本機(jī)可以訪問,跨容器則不行。
### 故障分析:
可以肯定服務(wù)器間的通信是沒有問題的,包括udp端口的問題也驗(yàn)證沒有問題,多次測試,網(wǎng)上說可能是docker網(wǎng)卡的mtu導(dǎo)致的故障:[https://www.cnblogs.com/rslai/p/9252511.html](https://www.cnblogs.com/rslai/p/9252511.html),服務(wù)器真實(shí)網(wǎng)卡mtu為1450,docker0網(wǎng)卡mtu為1500,修改配置,重啟,但驗(yàn)證后發(fā)現(xiàn)問題還是沒有變化。

image.png
故障解決:
用于k8s間通信的calico還會再生成一個(gè)虛擬網(wǎng)卡用于容器間通信,calico配置mtu配置參數(shù)如下:
veth_mtu: "1450"
初步估計(jì)是這的問題,將值該小至1400,刪除calico組件,重新創(chuàng)建,問題解決了,容器間可以訪問大量數(shù)據(jù)了。
原因猜測:
mtu的有效值為1-1500,docker的網(wǎng)卡轉(zhuǎn)發(fā)當(dāng)然沒有問題,但calico啟用tunnel模式,因此經(jīng)過tunnel會封裝一個(gè)新的20字節(jié)的ip包頭,所以當(dāng)發(fā)送大量數(shù)據(jù)時(shí),calico生成的1450大小的數(shù)據(jù)包再加上20大小的ip包頭,就無法通過eth0網(wǎng)卡來轉(zhuǎn)發(fā)通過calico的通信數(shù)據(jù)包,相當(dāng)于自己訂了1450的規(guī)則,自己又違反,自己的eth01450的大小又限制自己1470的包,所以calico的最大配置為1430字節(jié)時(shí),便可以通信。
結(jié)語:k8s是個(gè)方便的好東西,但大大小小的問題也時(shí)非常的棘手。