【问题标题】:Does kube-proxy filter HTTP POST payload for JSON content type?kube-proxy 是否过滤 JSON 内容类型的 HTTP POST 有效负载?
【发布时间】:2021-11-09 20:29:27
【问题描述】:

我的 kubernetes 集群(1.18.20,calico 3.14.2)遇到了相当奇怪的行为:当我尝试通过 NodePort 服务通过 curl 将 2 兆字节的 JSON 文件上传到 pod 时,传输被 @ 中断987654322@。 流量捕获显示客户端和服务器都收到来自网络的 RST 数据包,但没有发送它们。 相同大小的二进制文件上传成功,但无论指定Content-Type,JSON 都会被拒绝。 pod 之间的文件传输(使用类似的命令和相同的文件)顺利进行。 通过入口上传(也使用NodePort 配置)也失败了。 接收到的分片大小始终相同,约为 850K。

我使用了nc -l 80* 而不是真正的服务,结果相同。

显然,kube-proxy 不喜欢大的 JSON 文件。

是否可以从外部客户端向 pod 发送大的 JSON 文件,或者这样的限制是硬编码的?

UPD1

新集群的行为相同(1.22.0,calico 3.20.0)。

UPD2

系统不会拒绝所有大的 JSON 有效负载,但只会拒绝百分之几的用户上传。 Payload 由客户端应用程序特制:多卷 Zip 存档的第一部分采用 base64 编码并封装为 JSON 文件 ('{ "data": "..." }')。 导致连接中断的片段大小约为 640K。

kube-proxy 内部的过滤过程看起来像错误。

【问题讨论】:

    标签: kubernetes kubernetes-networking


    【解决方案1】:

    不幸的是,问题的根源在于 IDS/IPS 配置错误。

    kube-proxy 无关。

    【讨论】:

      【解决方案2】:

      您是否尝试过使用conntrack 来解决您的连接问题?它只是通过以下命令安装:

      apt-get install conntrack #[ debian/ubuntu ]
      yum install conntrack #[ centos/redhat ] 
      

      您可以对最大尺寸进行任何试验,但您可以从以下指标开始检查是否发生了某些事情:

      sysctl -w net.netfilter.nf_conntrack_buckets=300
      sysctl -w net.netfilter.nf_conntrack_max=1200
      

      请找到更详细的指南here

      【讨论】:

      • 是的,我有。在空闲集群上使用和不使用 net.netfilter.nf_conntrack_tcp_be_liberal=1 时都会出现错误,conntrack -E 仅显示 SYN_SENT/SYN_RECV/ESTABLISHED关闭。问题取决于有效载荷的内容,而不是它的大小。 pod 之间的通信也不受影响,但如果文件片段足够大,则尝试从外部计算机连接会失败。怀疑它是否可能链接到 conntrack。
      猜你喜欢
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 2017-01-24
      • 1970-01-01
      • 2015-02-18
      • 2017-08-06
      相关资源
      最近更新 更多