Kubernetes Ingress Nginx镜像请求到外部端点时报子请求过大问题
问题原因
- 你在Ingress注解中配置的
nginx.ingress.kubernetes.io/proxy-body-size: 50m只会作用于业务匹配的location块,Ingress Nginx自动生成的mirror内部location(即/_mirror-xxx的内部路由)不会继承该配置,默认使用Nginx全局的client_max_body_size默认值1M。你报错的请求体大小为1.47MB,超过了1M的限制,所以触发子请求过大错误,镜像请求被拦截,不会转发到存储后端。 - 你的注解存在拼写错误:
nginx.ingress.kubernetes.io/use-reges应为nginx.ingress.kubernetes.io/use-regex,虽然该错误不直接影响本次mirror的问题,但会导致正则匹配类的配置不生效,建议修正。
解决方案
方案1:通过配置snippet给mirror内部location增加大小限制
在Ingress的annotations中增加nginx.ingress.kubernetes.io/configuration-snippet,手动给mirror的内部location设置client_max_body_size,示例配置如下:
nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /backend/process nginx.ingress.kubernetes.io/proxy-body-size: 50m nginx.ingress.kubernetes.io/mirror-target: https://us-west2-project-name.cloudfunctions.net/backend-store # 新增以下配置 nginx.ingress.kubernetes.io/configuration-snippet: | location ~ ^/_mirror-.* { client_max_body_size 50m; }
方案2:全局调整Ingress Nginx控制器的默认client_max_body_size
如果你需要所有mirror请求都支持大文件,可以修改Ingress Nginx控制器的ConfigMap,增加client-max-body-size: 50m配置,该配置会全局生效,所有server和location的默认大小都会调整为50M。
额外优化(可选)
如果你的请求体普遍超过默认的client_body_buffer_size(默认8k/16k),可以通过nginx.ingress.kubernetes.io/client-body-buffer-size注解调整缓冲区大小,减少请求体落盘的情况,提升转发性能:
nginx.ingress.kubernetes.io/client-body-buffer-size: 10m
内容的提问来源于stack exchange,提问作者Silver Flash
相关产品推荐
相关产品推荐

