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 限制,否则只是把报错推后一层。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189