kubernetes - Pod 到 Pod 的通信是 2 个 Pod 在同一个节点上偶尔失败 (EKS 1.13)
问题描述
症状
对应用程序的请求偶尔会给出 http 504 或较长的等待时间(12 秒的倍数)。
我们在 pod 到 pod 的通信中遇到问题,其中 2 个 pod 位于 kubernetes 的同一节点上。
例如,从 nginx 入口到同一节点上的应用程序 pod 从应用程序 pod 到同一节点上的应用程序 pod 从应用程序 pod 到同一节点上的 rabbitmq eventbus pod
我们的基础设施
在 nginx 入口服务上具有经典 ELB(内部和外部)(不是网络 lb)的 EKS。负载均衡器服务具有本地的 externalnetworkpolicy。EKS 1.13 和节点版本 1.13.8(eks 优化 ami)
TCPDUMP
以下是来自应用程序 pod 的有用 tcpdump 输出,该 pod 尝试连接到事件总线,但失败了。在大多数情况下(通常在 12 秒后),它会在几次重试后成功:
13:44:46.744764 IP customer-reports-service-5b4d8c48b-vj4db.35196 > eventbus-rabbitmq.kube-system.svc.cluster.local.5672:标志 [S],seq 1434468571,win 26883,选项 [mss 8961, sackOK,TS val 4064032250 ecr 0,nop,wscale 7],长度 0
13:44:46.751000 IP ip-10-0-161-173.eu-west-1.compute.internal > customer-reports-service-5b4d8c48b-vj4db:ICMP 在途时间超过,长度 68
有关此 tcpdump 的信息: 1. 应用程序 pod 向同一节点上的 eventbus pod 发出请求 2. 节点向应用程序 pod 发送超过 icmp 时间。可能请求永远不会到达事件总线。
可能的解决方法
使用 pod 反亲和性来确保每个 eventbus pod、每个 nginx 入口 pod、每个 api 网关都运行在不同的节点上,然后我们的应用程序服务
但我正在寻找问题的实际解决方案。
其他相关参考
https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/#a-pod-cannot-reach-itself-via-service-ip 我的 EKS 设置中的发夹模式是 hairpin-veth。有如下指令:确保 Kubelet 有权限在 node 的 /sys 下运行。但我不确定如何做到这一点,因为在 EKS 上 cbr0 接口不存在,它使用 eni 接口
解决方案
好的,在发布问题后,AWS 为我提供了解决问题的方法:
问题: https ://github.com/aws/amazon-vpc-cni-k8s/issues/641
将 VPC CNI 插件降级到 v1.5.3 直到 1.5.5 发布:更新 daemonset 并重启所有节点
推荐阅读
- java - 如何将 javax.json jar 正确包含到已部署的 .jar 文件中
- ionic-framework - 将样式表导入 app.scss 以在整个项目中使用
- javascript - 带有html2canvas的jsPDF产生模糊的pdf?
- laravel - Mongo 查找条件
- mysql - 在 MySQL 服务器版本 8 上执行 MySQL 查询时出错
- python - 如何创建一个空白的日期时间对象?所以我可以找到时间增量的平均值
- html - 为什么我在使用 DJANGO 表单集时没有从 CharField 获得标签
- ruby-on-rails - 在 ruby on rails 中找不到 Order
- c - 添加具有给定条件的数组元素
- azure - 使用 API 扩展 Azure SQL DB