kube-ovn net/http TLS handshake timeout
问题现象
业务报错net/http: TLS handshake timeout。
容器IP跨节点访问kube-apiserver service clusterIP不通。
问题分析
k ko trace [ns]/[pod] [ip] tcp 443 | grep 对端主机ip
kube-ovn在br-int网桥上刷流表实现了kube-proxy的dnat功能。
kube-ovn监听service的endpoints,像kube-proxy一样感知变化。
设置ovs端口ovn0 mtu方法
ovs-vsctl set Interface ovn0 mtu_request=1460
mtu设置在ip层,内核不考虑数据链路层的以太网头14字节。
2个主机网口mtu都是1500。
容器网卡和ovn0口mtu最大是1442,1443以上就不行了。
关闭kube-apiserver所在宿主机网口和ovn0口的gso和tso。
容器网卡和ovn0口mtu 1442场景mss是1402
kube-apiserver所在宿主机网口抓包
大包1514字节-以太网头14字节=1500字节,可以通过主机网口。
容器网卡和ovn0口mtu 1443场景mss是1403
kube-apiserver所在宿主机ovn0口抓包
大包1457字节+udp geneve封装58字节-以太网头14字节=1501字节,无法通过主机网口,因为设置不可分片,所以直接丢弃。
udp geneve封装58字节=内层以太网头14字节+geneve头16字节+udp头8字节+ip头20字节
geneve报文能否满足Linux内核网卡mtu,看内层大小+58。
kube-ovn中设置mtu是靠ovn-cni的启动参数mtu。
ds ovn-cni走主机网络,修改启动参数mtu会触发滚动更新,只有新cni流程才会生效。
解决方法
容器网卡和ovn0口mtu从1460恢复成默认的1400,至少在1442以下。