问题现象
业务报错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一样感知变化。
模拟访问kube-apiserver
从kube-system命名空间下ovn这个sa中获取证书和token
curl -i -H "Authorization: Bearer $TOKEN” --cacert ca.crt https://xxx:443/api/v1/nodes/xxx
设置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。
ovn-cni走主机网络,pod属于ds。
容器网卡mtu初始值是65435,修改ds ovn-cni启动参数mtu后会类似于deploy滚动更新那样逐个更新,但是ovn-cni pod更新完成后,不会自动更新当前节点上的mtu,直到触发cni add,例如删除pod和重建pause容器。
解决方法
容器网卡和ovn0口mtu从1460恢复成默认的1400,至少在1442以下。
标签:TLS,handshake,http,字节,ovn0,mtu,网卡,kube,ovn From: https://www.cnblogs.com/WJQ2017/p/18448736