K8s 1.25 用 nginx-ingress,后台上传 20M 的素材报 413 Request Entity Too Large,改了 ConfigMap 里的 proxy-body-size 也没生效,其他站点倒是放开了。
原因不止一个,得分开看。Ingress 的 annotation 优先级高于 ConfigMap,单个 Ingress 上仍写着 1m,全局改多大都会被它盖回去;注解名写成了 nginx.ingress.kubernetes.io/proxy-body-size 但值带单位格式不对;后端应用自己的上传限制更小,413 是应用返回的而不是 nginx;改的是另一个命名空间里的 ConfigMap,控制器读的是自己那份。
动手时先确认 413 是哪一层返回的
curl -sI -X POST --data-binary @20m.bin https://www.example.com/upload | grep -iE 'server|content-length'
再往下看 Ingress 上的注解值
kubectl get ingress web -o jsonpath='{.metadata.annotations}'
接着按 Ingress 单独设置请求体上限
kubectl annotate ingress web nginx.ingress.kubernetes.io/proxy-body-size=50m --overwrite
末了确认控制器配置已重载
kubectl -n ingress-nginx logs deploy/ingress-nginx-controller --tail=20 | grep -i reload
白天有业务在跑,能验证的部分都压到了晚上做。
当时还开着另一个排查窗口,两边日志对照着看才定位到。
恢复的判定其实很直接。上传 20M 文件返回 200,响应头里不再出现 413,控制器日志出现配置重载记录。
补一句。annotation 会覆盖全局配置,排查要先看单个 Ingress;上传大文件还要同步调大应用的 multipart 限制,否则只是把报错推后一层。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
