Azure Kubernetes中Nginx Ingress 413请求实体过大问题排查
在Kubernetes集群中运行的应用,同一集群的platform命名空间部署了Nginx Ingress Controller。应用的Ingress资源配置了注解nginx.ingress.kubernetes.io/proxy-body-size: "0",但上传超过100MB的文件时(99MB正常,101MB触发413错误),出现413 请求实体过大的报错。
此前应用在独立服务器运行时无此问题,推测是Kubernetes集群的Nginx Ingress在强制执行请求体大小限制。已尝试通过Helm升级命令设置相关参数,也修改了对应的ConfigMap配置,但均未解决问题。
已执行的Helm升级命令
helm upgrade --install nginx-ingress ingress-nginx/ingress-nginx -n platform --version 4.3.0 --namespace platform --set controller.replicaCount=2 --set controller.nodeSelector."kubernetes\.io/os"=linux --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux --set-string controller.config.proxy-body-size=150m --set-string controller.config.client-max-body-size=150m --set controller.service.loadBalancerIP=" 00.00.000.000" --set controller.service.externalTrafficPolicy=Local --force
修改后的ConfigMap配置
kind: ConfigMap apiVersion: v1 metadata: name: nginx-ingress-ingress-nginx-controller namespace: platform uid: 56d779d6-19c2-48fc-95de-fbd2149b3bf6 resourceVersion: '116031130' creationTimestamp: '2023-04-27T09:45:38Z' labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: nginx-ingress app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.4.0 helm.sh/chart: ingress-nginx-4.3.0 annotations: meta.helm.sh/release-name: nginx-ingress meta.helm.sh/release-namespace: platform managedFields: - manager: Mozilla operation: Update apiVersion: v1 time: '2023-04-27T09:45:38Z' fieldsType: FieldsV1 fieldsV1: f:data: .: {} f:allow-snippet-annotations: {} f:metadata: f:annotations: .: {} f:meta.helm.sh/release-name: {} f:meta.helm.sh/release-namespace: {} f:labels: .: {} f:app.kubernetes.io/component: {} f:app.kubernetes.io/instance: {} f:app.kubernetes.io/managed-by: {} f:app.kubernetes.io/name: {} f:app.kubernetes.io/part-of: {} f:app.kubernetes.io/version: {} f:helm.sh/chart: {} - manager: helm operation: Update apiVersion: v1 time: '2023-05-03T13:09:41Z' fieldsType: FieldsV1 fieldsV1: f:data: f:client-max-body-size: {} f:proxy-body-size: {} data: allow-snippet-annotations: 'true' client-max-body-size: 150m proxy-body-size: 150m
确认Ingress Controller Pod重载配置:修改ConfigMap或执行Helm升级后,需确认Ingress Controller Pod已重启加载新配置。可手动重启Pod:
kubectl rollout restart deployment nginx-ingress-ingress-nginx-controller -n platform重启后进入Pod验证Nginx配置:
kubectl exec -it <nginx-controller-pod-name> -n platform -- cat /etc/nginx/nginx.conf | grep client_max_body_size若输出不是
150m,说明配置未正确加载。检查Ingress资源注解有效性:确认应用Ingress的
nginx.ingress.kubernetes.io/proxy-body-size: "0"注解无拼写错误,且被Ingress Controller识别。查看Ingress描述信息:kubectl describe ingress <your-ingress-name> -n <app-namespace>部分场景下全局配置可能覆盖注解,需确保注解优先级生效。
排查中间负载均衡的限制:若集群前端存在云厂商LB或其他代理组件,这些服务通常默认有100MB的上传限制,需在对应组件中调整请求体大小阈值。
修正全局配置的键名冲突:Ingress-Nginx 1.4.0版本中,全局配置的正确键名是
client-max-body-size,proxy-body-size仅用于Ingress注解。建议修改Helm命令,去掉controller.config.proxy-body-size=150m的设置,重新升级:helm upgrade --install nginx-ingress ingress-nginx/ingress-nginx -n platform --version 4.3.0 --namespace platform --set controller.replicaCount=2 --set controller.nodeSelector."kubernetes\.io/os"=linux --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux --set-string controller.config.client-max-body-size=150m --set controller.service.loadBalancerIP="00.00.000.000" --set controller.service.externalTrafficPolicy=Local --force验证应用自身的上传限制:确认应用框架的上传配置未被修改,比如Spring Boot的
spring.servlet.multipart.max-file-size、Node.js的body-parser等,确保应用侧未限制文件大小。
内容的提问来源于stack exchange,提问作者Marnick

