Docker 向Kubernetes中的容器发送大于400 KB的有效负载失败

Docker 向Kubernetes中的容器发送大于400 KB的有效负载失败,docker,kubernetes,Docker,Kubernetes,我在AWS中使用EKS(Kubernetes),我在向任何运行在Kubernetes容器中的web服务器发送大约400 KB的负载时遇到问题。我达到了某种程度的限制,但它的大小并没有限制,它似乎在400千字节左右很多次都能正常工作,但有时我会得到(使用Python请求进行测试) 我使用不同的容器(Alpine上的PythonWeb服务器、CentOS上的Tomcat服务器、nginx等)来测试这一点 我越是将大小增加到超过400 KB,我得到的一致性就越高:由对等方重置连接 有什么想法吗?由对等

我在AWS中使用EKS(Kubernetes),我在向任何运行在Kubernetes容器中的web服务器发送大约400 KB的负载时遇到问题。我达到了某种程度的限制,但它的大小并没有限制,它似乎在400千字节左右很多次都能正常工作,但有时我会得到(使用Python请求进行测试)

我使用不同的容器(Alpine上的PythonWeb服务器、CentOS上的Tomcat服务器、nginx等)来测试这一点

我越是将大小增加到超过400 KB,我得到的一致性就越高:由对等方重置连接


有什么想法吗?

由对等方重置连接,即使是在集群内的服务之间,听起来可能是错误的。修复程序包括运行以下程序:

echo 1 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_be_liberal
您可以使用以下守护程序自动执行此操作:

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
正如建议的那样,您可以尝试更改kube代理操作模式。要编辑kube代理配置,请执行以下操作:

kubectl -n kube-system edit configmap kube-proxy

搜索模式:“”,然后尝试“iptables”、“userspace”或“ipv”。每次更改configmap时,请删除kube代理pod,以确保它正在阅读新的configmap。

感谢您的回答和评论,帮助我更接近问题的根源。我确实将AWS集群从1.11升级到了1.12,这在Kubernetes中从一个服务访问另一个服务时清除了这个错误。但是,当使用公共dns(即负载平衡器)从Kubernetes群集外部访问时,错误仍然存在。 因此,在进行了更多测试后,我发现问题在于ALB或Kubernetes的ALB控制器: 因此,我切换回Kubernetes服务,该服务生成较老一代的ELB,问题得到了解决。ELB并不理想,但目前它是一个很好的解决方案,直到ALB控制器得到修复,或者我按下了正确的按钮来修复它。

正如您在本文中提到的,该问题可能是由ALB或Kubernetes的ALB控制器引起的:

您能否检查Nginx入口控制器是否可与ALB一起使用

Nginx将请求大小的默认值设置为1Mb。可以使用以下命令更改它:
nginx.ingres.kubernetes.io/proxy body size


您是否在任何地方配置连接保持活动状态或连接超时?

Azure及其防火墙也存在类似问题,它阻止发送超过128KB的补丁请求。 在团队中研究和思考了这种方法的利弊之后,我们的解决方案就完全不同了

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

最大的优点是,我们的API不会被大请求及其长时间运行的作业阻塞

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


请参见,Leonhard

请求是否通过AWS ALB提交?或者您使用kube proxy发送请求?或者您使用的是
ingress
?我使用的是创建ALB的ingress。因此,我在这里使用AWS ALB入口控制器:但是,当我从服务o服务请求时,我看到了问题。您的web服务器是什么,以及它在容器中是如何配置/启动的?嗨,BMitch,谢谢您的回答。但是,我这里没有netfilter文件夹:ls:/proc/sys/net/ipv4/netfilter:没有这样的文件或目录。与内核版本有关吗?uname-r给出了4.14.106-97.85.amzn2.x86\u 64无论如何,发现这个:echo 1>/proc/sys/net/netfilter/nf\u conntrack\u tcp\u自由但它没有解决问题抱歉,没有解决问题,症状看起来很相似。您可能需要像链接文章一样开始跟踪网络流量,以查看重置从何处生成,这也取决于您的CNI提供商。有关如何针对容器命名空间网络运行tcpdump等工具的详细信息,请签出感谢链接,我将使用链接中的工具来调试问题并让您知道。我注意到的一点是,curl返回http响应,即使是在大型上传时,python请求也会重置连接。因此,这也取决于http请求是如何生成的Victor,谢谢您的回答。似乎这在AWS中是不可更新的,我不理解这一变化的全部含义。看起来是个大问题。我们正在与AWS支持部门讨论,他们确认问题出在ALB内部。我没有配置保持活动或超时。但是,当使用另一个LB时,使用同一服务器的客户端请求在不同的场景中工作。酷。你能在解决方案修复后分享吗?Leonhard,谢谢你的想法。但这不是我们做事方式的问题。在不同的技术(java、python、nodejs)和不同的需求上,我们有不同类型的服务器应用程序和客户端应用程序。我们不能规定所有POST有效负载都小于400KB。其余的应用程序和服务器可以在没有任何问题的情况下发布几MB。我们也应该这样做。几天后的测试表明,这与Docker或Kubernetes无关,也与ALB控制器无关。ALB本身具有这种行为。我做了一个测试,在ALB后面有一个普通的AWS EC2实例,我遇到了同样的问题。这就是ALB。谢谢大家的帮忙
kubectl -n kube-system edit configmap kube-proxy