Kubernetes 默认的 Ingress(通常是基于 NGINX 的 ingress-nginx 控制器)在处理上传大文件时会报 413 Request Entity Too Large 错误。这是因为 nginx 默认的请求体大小限制较小,通常为 1MB。如果客户端请求体超过这个大小,nginx 会直接返回 413 错误[1][2][3][4]。
解决方法:
你有两种主要方式修改这个限制:
1. 在 Ingress 资源上添加 Annotation(推荐针对单个服务调整)
在你的 Ingress YAML 文件的 metadata.annotations 字段中添加如下配置:
1nginx.ingress.kubernetes.io/proxy-body-size: "100m"例如:
1apiVersion: networking.k8s.io/v1
2kind: Ingress
3metadata:
4 name: my-ingress
5 annotations:
6 nginx.ingress.kubernetes.io/proxy-body-size: "100m"
7spec:
8 ...设置为 "0" 表示不限制大小(不推荐,需谨慎使用)[2][4]。
2. 全局调整(适用于所有 Ingress)
如果你希望全局生效,可以修改 ingress-nginx 控制器的 ConfigMap:
1apiVersion: v1
2kind: ConfigMap
3metadata:
4 name: ingress-nginx-controller
5 namespace: ingress-nginx
6data:
7 proxy-body-size: "100m"或者在 Helm 安装 ingress-nginx 时,通过 values.yaml 或 --set 参数:
1controller:
2 config:
3 proxy-body-size: 100m或
1helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx --set controller.config.proxy-body-size=100m其他注意事项
- 修改后需确保 ingress-nginx 控制器 Pod 已重启或配置已生效。
- 如果你的后端服务也有限制(比如 Node.js 的 bodyParser),也需要同步调整。
- 413 错误只与请求体大小相关,和其它超时或 header 限制无关[1][2].
总结:
413 错误是由于 NGINX Ingress 默认请求体大小太小导致的,可通过在 Ingress 资源添加 nginx.ingress.kubernetes.io/proxy-body-size 注解,或全局修改 ingress-nginx 的 ConfigMap/Helm 参数来解决[1][2][3][5][4]。
[1] https://stackoverflow.com/questions/64759983/nginx-ingress-returns-413-entity-too-large [2] https://www.yellowduck.be/k8s-nginx-payload-too-large [3] https://jessicadeen.com/posts/2019/error413-k8s-helm/ [4] https://stackoverflow.com/questions/64759983/nginx-ingress-returns-413-entity-too-large/76226190 [5] https://github.com/kubernetes/ingress-nginx/issues/4825 [6] https://www.suse.com/support/kb/doc/?id=000021309 [7] https://www.loft.sh/blog/kubernetes-nginx-ingress [8] https://community.okteto.com/t/ingress-413-request-entity-too-large/857 [9] https://imti.co/413-request-entity-too-large/ [10] https://github.com/kubernetes/ingress-nginx/issues/1824