Kube-proxy或ELB"延迟"HTTP请求的数据包

ArA*_*rAr 10 amazon-elb kubernetes project-calico kops kube-proxy

我们在AWS上的Kubernetes(1.9.3)上运行了一个Web API应用程序(使用KOPS设置).该应用程序是一个部署,由服务(类型:LoadBalancer)表示,该服务实际上是AWS上的ELB(v1).这通常有效 - 除了一些数据包(HTTP请求的片段)在客户端< - > app容器之间的某处"延迟".(在终止于ELB的HTTP和HTTPS中).

从节点方面:

(注意:服务器端的几乎所有数据包都会重复3次)

我们使用keep-alive,因此tcp套接字是打开的,请求到达并返回相当快.然后问题发生了:

  • 首先,只有头部的数据包到达[PSH,ACK](我在tcpdump中查看有效负载中的头部).
  • 一个[ACK]由容器发回.
  • tcp套接字/流安静很长时间(最多30秒甚至更多 - 但是间隔不一致,我们认为> 1s是一个问题).
  • 另一个带有HTTP数据的[PSH,ACK]到达,最终可以在应用程序中处理该请求.

从客户端:

我从我的计算机上运行一些流量,在客户端记录它以查看问题的另一端,但不是100%确定它代表真正的客户端.

  • 一个[PSH,ASK]标题出来了.
  • 带有部分有效负载的几个[ACK]开始出去.
  • 没有响应到达几秒钟(或更长时间),没有更多的数据包熄灭.
  • 标记为[TCP窗口更新]的[ACK]到达.
  • 再次短暂停顿,[ACK]开始到达,会话一直持续到有效载荷结束.

这只发生在负载下.

根据我的理解,这是介于ELB和Kube-Proxy之间的某个地方,但我很无能为力,急需帮助.

这是Kube-Proxy运行的参数:

Commands: /bin/sh -c mkfifo /tmp/pipe; (tee -a /var/log/kube-proxy.log < /tmp/pipe & ) ; exec /usr/local/bin/kube-proxy --cluster-cidr=100.96.0.0/11 --conntrack-max-per-core=131072 --hostname-override=ip-10-176-111-91.ec2.internal --kubeconfig=/var/lib/kube-proxy/kubeconfig --master=https://api.internal.prd.k8s.local --oom-score-adj=-998 --resource-container="" --v=2 > /tmp/pipe 2>&1

我们使用Calico作为CNI:

到目前为止,我已经尝试过:

  • 使用service.beta.kubernetes.io/aws-load-balancer-type: "nlb"- 问题仍然存在.
  • (玩弄ELB设置希望有什么东西可以做到这一点¯_(ツ)_ /¯)
  • 在Kube-Proxy中查找错误,发现以下情况很少见:

E0801 04:10:57.269475 1 reflector.go:205] k8s.io/kubernetes/pkg/client/informers/informers_generated/internalversion/factory.go:85:无法列出*core.Endpoints:获取https:// api. internal.prd.k8s.local/api/v1/endpoints?limit = 500&resourceVersion = 0:在10.176.0.2:53上拨打tcp:lookup api.internal.prd.k8s.local:没有这样的主机

...和...

E0801 04:09:48.075452 1 proxier.go:1667]无法执行iptables-restore:退出状态1(iptables-restore:第7行失败)I0801 04:09:48.075496 1 proxier.go:1669]关闭iptables后的本地端口-restore失败

我找不到任何描述此类问题的内容,并会感谢任何帮助.欢迎提出如何继续和排除故障的想法.

最好的,A