问题描述
容器 pod 请求另外一组容器公网域名访问部分不通,报错connection refused,我们该如何排查此类问题?
问题分析
ingress-nginx-controller 使用的 loadbalancer service 的 trafficPolicy 是 Local 模式的,在集群内的其他节点访问 clb public ip 会被 ipvs 劫持,从而导致访问失败,如果 client pod 在 ingress-nginx-controller 节点上会被转发,从而出现部分不通的情况。 排查步骤如下:
- ping telnet 等测试检查 端口和网络通信,
- 公网其他客户端请求访问正常
- 在pod异常时, 所在node tcpdump抓包分析 ,查看ping 和curl 对比分析数据包
tcpdump -v -i any host 异常域名
如上图所示查看POD请求优先转到了 ingress-nginx-contoller,检查ingress所在节点 ipvs规则是否有转发 4.发现在不通的node上没有转发规则。
解决方案
需要考虑如下两点:
- ingress nginx 的 service 设置为 Local 模式的话,集群内节点(非 ingress 所在节点)访问 ingress 会被 ipvs 劫持导致访问不通。
- ingress nginx 的 service 设置为 Cluster 模式的话,ingress nginx 不能获取客户端 IP。
配置方面的建议如下:
- 评估如何不需要获取真实IP可以更改成Cluster模式。
- 集群内POD使用service 访问service-name.namespace-name. svc.cluster.local。
- 修改 coredns 请参考[1]。
参考文档
[1]https://github.com/coredns/coredns/tree/0348b019be984a5e21c40d00d37da2bbcc7d1b20/plugin/forward 如果您有其他问题,欢迎您联系火山引擎技术支持服务