我们在 AWS 的 Kubernetes (1.9.3) 上运行一个 Web API 应用程序(使用 KOPS 设置)。该应用程序是一个部署,由一个服务(类型:LoadBalancer)表示,它实际上是 AWS 上的 ELB(v1)。这通常有效 - 除了某些数据包(HTTP 请求的片段)在客户端 <-> 应用程序容器之间的某处“延迟”。(在 ELB 上终止的 HTTP 和 HTTPS 中)。
从节点端:
(注意:几乎所有服务器端的数据包都重复 3 次到达)
我们使用 keep-alive,因此 tcp 套接字是打开的,请求到达和返回的速度非常快。然后问题发生了:
- 首先,一个只有标头的数据包到达 [PSH,ACK] (我看到带有 tcpdump 的有效负载中的标头)。
- 一个 [ACK] 由容器发回。
- tcp 套接字/流在很长一段时间内都很安静(最多 30 秒或更长时间- 但间隔不一致,我们认为 > 1 秒是一个问题)。
- 另一个带有 HTTP 数据的 [PSH, ACK] 到达,最终可以在应用程序中处理请求。
从客户端:
我已经从我的计算机运行了一些流量,将其记录在客户端以查看问题的另一端,但不能 100% 确定它代表真正的客户端。
- 带有标题的 [PSH,ASK] 熄灭。
- 一些带有部分有效负载的 [ACK] 开始发出。
- 几秒钟(或更长时间)没有响应到达,也没有更多的数据包出去。
- 标记为[TCP Window update]的[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:拨号 tcp:在 10.176.0.2:53 上查找 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 后关闭本地端口- 恢复失败
我找不到任何描述此类问题的内容,并将不胜感激。欢迎提出有关如何继续和排除故障的想法。
最好的,一个