问题背景
为了解决节点上请求部分service延迟63s问题[1],我们临时把OS的版本换成了Redhat 8.4
(内核版本4.18.0-305
),在VMware
上虚出3节点集群后部署跨三层环境失败,提示Harbor
部署失败。
原因分析
说明:距离定位这个问题已经有一段时间了,其实最终也没完全定位出根本原因,所以当时也没有整理记录定位过程,这里就简单描述一下,做个记录。
通过查看Harbor
的日志,发现部署失败的原因是健康检查失败,因为Harbor
的podIp:port
请求在跨三层下超时,抓包发现请求经过vxlan.calico
时止于SYN_SENT
报文;
实测发现,该环境上不仅是Harbor
的podIp:port
请求超时,其他pod
服务的请求经过跨三层的网络也同样存在问题,说明是一个共性问题,并且pod
网段的七层如http
请求受影响,4层的icmp
请求不受影响);
继续通过抓包确认,podIp:port
的请求已经发送到节点网卡上,但跨三层对端的节点没有收到。所以,可以排除主机上的iptables
和路由的影响。实际上,也确实跟踪了iptables
的请求过程,确认请求没有被丢弃;
综上,初步怀疑请求被跨三层网络的中间设备(如交换机、路由器)丢弃了,之后相关同事在交换机上抓包,发现ping
包可以抓到,但http
请求依然抓不到,说明交换机侧也没有收到报文,问题原因进一步缩小,可能情况有:
- 出口网卡丢弃;
- 出网卡后,入交换机之前丢弃;
通过ehtool -s xxx
命令统计虚机网卡报文信息,没有发现丢弃情况,说明问题不在虚机的出网卡;
关于VMware
丢弃报文的情况,找到一些资料[2-6],比如混杂模式,mms
配置都会有影响:
1 | 1) 通过ping命令指定报文长度,发现跨网段依次ping一下pod的ip均返回正常,确认不是mms问题; |
进一步在服务器物理网卡上抓包(登录esxi
后台,使用pktcap-uw --uplink vmnicX --dir 2 -o result.pcap
,其中vmnicX
表示虚机关联的上行口物理网卡, dir 2
表示同时抓取双向请求), 依然是ping
包可以抓到,但http
请求依然抓不到,说明服务器物理网卡上也没有收到报文;
最后,丢包范围缩小到VMare
下的虚机机请求出网卡后,到服务器物理网卡前 ,这中间涉及到虚拟化的实现,具体还有什么处理就不清楚了,最后改为使用物理服务器部署;
解决方案
临时改用物理服务器部署跨三层集群成功,如果要使用VMware
虚机部署,还需要继续排查根因。
参考资料
- https://lyyao09.github.io/2022/03/19/k8s/K8S%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5-Calico%E7%9A%84Vxlan%E6%A8%A1%E5%BC%8F%E4%B8%8B%E8%8A%82%E7%82%B9%E5%8F%91%E8%B5%B7K8s%20Service%E8%AF%B7%E6%B1%82%E5%BB%B6%E8%BF%9F/
- https://kb.vmware.com/s/article/2113783
- https://kb.vmware.com/s/article/52936
- https://docs.vmware.com/en/VMware-NSX-T-Data-Center/2.3/troubleshooting/GUID-4E4A9468-1F2B-44E1-A474-AA048A88BF1E.html
- https://communities.vmware.com/t5/vCloud-Networking-and-Security/No-SYN-ACK-reply-from-VM-on-virtual-wire-VXLAN/td-p/376545