如何排查容器Pod访问公网CLB报Connection refused的问题

容器与中间件容器服务技术服务知识库
问题描述

容器 pod 请求另外一组容器公网域名访问部分不通,报错connection refused,我们该如何排查此类问题? 图片

问题分析

ingress-nginx-controller 使用的 loadbalancer service 的 trafficPolicy 是 Local 模式的,在集群内的其他节点访问 clb public ip 会被 ipvs 劫持,从而导致访问失败,如果 client pod 在 ingress-nginx-controller 节点上会被转发,从而出现部分不通的情况。 排查步骤如下:

  1. ping telnet 等测试检查 端口和网络通信,
  2. 公网其他客户端请求访问正常
  3. 在pod异常时, 所在node tcpdump抓包分析 ,查看ping 和curl 对比分析数据包
tcpdump -v -i any host 异常域名

图片 如上图所示查看POD请求优先转到了 ingress-nginx-contoller,检查ingress所在节点 ipvs规则是否有转发 4.发现在不通的node上没有转发规则。

解决方案

需要考虑如下两点:

  1. ingress nginx 的 service 设置为 Local 模式的话,集群内节点(非 ingress 所在节点)访问 ingress 会被 ipvs 劫持导致访问不通。
  2. ingress nginx 的 service 设置为 Cluster 模式的话,ingress nginx 不能获取客户端 IP。

配置方面的建议如下:

  1. 评估如何不需要获取真实IP可以更改成Cluster模式。
  2. 集群内POD使用service 访问service-name.namespace-name. svc.cluster.local。
  3. 修改 coredns 请参考[1]。
参考文档

[1]https://github.com/coredns/coredns/tree/0348b019be984a5e21c40d00d37da2bbcc7d1b20/plugin/forward 如果您有其他问题,欢迎您联系火山引擎技术支持服务

23
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论