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