向Kubernetes中的容器发布大于400千字节的有效载荷失败

时间:2019-04-03 19:53:42

标签: docker kubernetes

我在AWS中使用EKS(Kubernetes),但在将大约400千字节的有效负载发布到该Kubernetes容器中运行的任何Web服务器时遇到了问题。我遇到了某种限制,但不是大小限制,似乎很多时候都可以达到约400 KB,但有时却可以(使用Python请求进行测试)

requests.exceptions.ChunkedEncodingError: ("Connection broken: ConnectionResetError(104, 'Connection reset by peer')", ConnectionResetError(104, 'Connection reset by peer'))

我用不同的容器(Alpine上的python Web服务器,CentOS上的Tomcat服务器,nginx等)进行了测试。

我将大小增加到400千字节越多,得到的结果越一致:对等方重置连接。

有什么想法吗?

5 个答案:

答案 0 :(得分:6)

感谢您的回答和评论,帮助我更加了解问题的根源。我确实将AWS集群从1.11升级到1.12,并且在Kubernetes中从服务访问服务时清除了该错误。但是,当使用公共dns从Kubernetes集群外部访问时,错误仍然存​​在,因此是负载均衡器。 因此,在进行了更多测试之后,我发现问题出在Kubernetes的ALB或ALB控制器上:https://kubernetes-sigs.github.io/aws-alb-ingress-controller/ 因此,我切换回了Kubernetes服务,该服务生成了较早的ELB,问题已得到解决。 ELB并不理想,但是暂时来说这是一个很好的解决方法,直到ALB控制器被修复或我有按下右键来修复它为止。

答案 1 :(得分:0)

由对等方重置的连接(即使在群集内的服务之间)听起来也可能是known issue with conntrack。该修复程序涉及运行以下命令:

echo 1 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_be_liberal

您可以使用以下DaemonSet将其自动化:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: startup-script
  labels:
    app: startup-script
spec:
  template:
    metadata:
      labels:
        app: startup-script
    spec:
      hostPID: true
      containers:
      - name: startup-script
        image: gcr.io/google-containers/startup-script:v1
        imagePullPolicy: IfNotPresent
        securityContext:
          privileged: true
        env:
        - name: STARTUP_SCRIPT
          value: |
            #! /bin/bash
            echo 1 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_be_liberal
            echo done

答案 2 :(得分:0)

根据this answer的建议,您可以尝试更改 kube-proxy 的操作模式。要编辑您的kube-proxy配置:

kubectl -n kube-system edit configmap kube-proxy

搜索模式:“” 并尝试“ iptables” “用户空间” “ ipvs” 。每次更改配置映射时,请删除kube-proxy pod,以确保它正在读取新的配置映射。

答案 3 :(得分:0)

正如您在此answer中所提到的,该问题可能是由ALB或Kubernetes的ALB控制器引起的:https://kubernetes-sigs.github.io/aws-alb-ingress-controller/

您可以检查Nginx Ingress控制器是否可以与ALB一起使用?

Nginx将请求大小的默认值设置为1Mb。可以使用以下annotation$("#in2").keyup(function (evt) { this.value = this.value.replace("(", ".").replace(/,/g, "."); }); 进行更改。

您还在任何地方配置连接保持活动或连接超时吗?

答案 4 :(得分:0)

我们在Azure及其防火墙方面遇到了类似的问题,该问题阻止发送超过128KB的补丁程序请求。 在团队中研究并考虑了这种方法的利弊之后,我们的解决方案便是一个完全不同的解决方案。

我们将“更大”的请求放入Blob存储中。之后,我们将一条消息与之前创建的文件名放到队列中。队列将接收带有文件名的消息,从存储中读取Blob,将其转换为您需要作为对象的对象,并能够在这个大对象上应用任何业务逻辑。 处理完消息后,文件将被删除。

最大的优点是,我们的API不会因为请求量大且工作时间长而被阻塞。

也许这是解决kubernetes容器中问题的另一种方法。

再见,莱昂哈德