Kubernetes和Nginx入口控制器出现413错误

ztyzrc3y  于 2023-03-07  发布在  Nginx
关注(0)|答案(8)|浏览(226)

我正在尝试更改client_max_body_size值,这样NGINX入口就不会返回HTTP 413 Content Too Large错误(如日志中所示)。
我试过几种解决方案。
以下是我的配置图:

kind: ConfigMap
apiVersion: v1
data:
  proxy-connect-timeout: "15"
  proxy-read-timeout: "600"
  proxy-send-timeout: "600"
  proxy-body-size: "8m"
  hsts-include-subdomains: "false"
  body-size: "64m"
  server-name-hash-bucket-size: "256"
  client-max-body-size: "50m"
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
  labels:
    app: ingress-nginx

这些变化根本没有影响:在NGINX控制器的日志中,我可以看到有关重新加载配置图的信息,但nginx.conf中的值是相同的:

$ cat /etc/nginx/nginx.conf | grep client_max                                                                                                       
                            client_max_body_size                    "8m";
                            client_max_body_size                    "1m";
                            client_max_body_size                    "1m";
                            client_max_body_size                    "1m";
                            client_max_body_size                    "1m";
                            client_max_body_size                    "1m";
                            client_max_body_size                    "1m";
                            client_max_body_size                    "1m";
                            client_max_body_size                    "1m";
                            client_max_body_size                    "1m";
                            client_max_body_size                    "1m";
                            client_max_body_size                    "1m";
                            client_max_body_size                    "1m";

我的nginx-controller配置使用此映像:quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.13.0
我怎样才能强迫NGINX改变这个设置呢?我需要全局地改变它,对于我所有的入口。

bmvo0sr5

bmvo0sr51#

您可以使用注解nginx.ingress.kubernetes.io/proxy-body-size在Ingress对象中设置max-body-size选项,而不是更改基本ConfigMap。
下面是用法示例:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-app
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"
...
sxissh06

sxissh062#

要全局设置它,configmap.md文档可能会有帮助,因为要设置的变量是proxy-body-size,而不是client-max-body-size
当您部署舵图时,您可以设置--set-string controller.config.proxy-body-size="4m"

zphenhs4

zphenhs43#

这里对于正确的注解是nginx.ingress.kubernetes.io/proxy-body-size还是nginx.org/client-max-body-size存在混淆,答案是可能是其中之一!
在所有参与者不容置疑的智慧中,世界上有两种不同的“NGINX入口”。很难分辨你在运行哪一种,而谷歌搜索在区分这一点上毫无用处(但有什么新的)。
如果您使用的是官方NGINX入口,正确的注解如下:https://docs.nginx.com/nginx-ingress-controller/configuration/ingress-resources/advanced-configuration-with-annotations/
如果您使用的是基于NGINX的官方Kubernetes入口,正确的注解如下:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#custom-max-body-size
如果入口实现的Docker镜像名称是k8s.gcr.io/ingress-nginx/controller,那么您使用的是Kubernetes官方版本,通过排除,您可以确定您使用的是不是NGINX实现。
我希望每个造成这种混乱状态的人都有非常糟糕的一天。剩下的人...保持乐观!

6yoyoihd

6yoyoihd4#

也许最近有些人在这里卡住了,我们刚刚做了注解nginx.ingress.kubernetes.io/proxy-body-size不再应用,正确的注解应该是:

annotations:
    nginx.org/client-max-body-size: "999m"

希望这对其他人有帮助。

93ze6v8z

93ze6v8z5#

更新:
我一直在经历同样的问题,没有解决方案。在阅读了无数的博客和文档,都有相同的建议解决方案,我发现他们已经改变了命名惯例。
它不再是由"代理机构的大小"表示,或者这只是从来没有为我工作。
下面的链接显示要使用的正确配置Map变量为"client-max-body-size"
https://docs.nginx.com/nginx-ingress-controller/configuration/global-configuration/configmap-resource/

9w11ddsr

9w11ddsr6#

您始终可以进行全局更改并完全禁用它

kubectl -n ingress-nginx patch configmap \
nginx-configuration -p '{"data": {"proxy-body-size": "0"}}'

或设置为5TB

kubectl -n ingress-nginx patch configmap \
nginx-configuration -p '{"data": {"proxy-body-size": "5tb"}}'
bis0qfac

bis0qfac7#

我在configmap上尝试了proxy-body-size和client-max-body-size,并滚动重启了nginx控制器pod,当我在pod中使用grep nginx.conf文件时,它返回默认值1 m。我正在Azure Kubernetes服务(AKS)中尝试执行此操作。我正在与他们的支持人员合作。他们说这不是他们的问题,因为这似乎是一个nginx配置问题。
奇怪的是,我们在Azure中有其他集群,直到我们在一些较新的部署中发现这一点,这才成为一个问题。他们提出的最初修复是这个线程中的内容,但它拒绝更改。
下面是我的配置图:

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  client-max-body-size: 0m
  proxy-connect-timeout: 10s
  proxy-read-timeout: 10s
kind: ConfigMap
metadata:
  annotations:
    control-plane.alpha.kubernetes.io/leader: '{"holderIdentity":"nginx-nginx-ingress-controller-7b9bff87b8-vxv8q","leaseDurationSeconds":30,"acquireTime":"2020-03-10T20:52:06Z","renewTime":"2020-03-10T20:53:21Z","leaderTransitions":1}'
  creationTimestamp: "2020-03-10T18:34:01Z"
  name: ingress-controller-leader-nginx
  namespace: ingress-nginx
  resourceVersion: "23928"
  selfLink: /api/v1/namespaces/ingress-nginx/configmaps/ingress-controller-leader-nginx
  uid: b68a2143-62fd-11ea-ab45-d67902848a80

发出滚动重启后:kubectl卷展重新启动部署/nginx-nginx-入口-控制器-n入口-nginx
通过获取nginx入口控制器pod来查询该值,现在可以看到:

kubectl exec -n ingress-nginx nginx-nginx-ingress-controller-7b9bff87b8-p4ppw cat nginx.conf | grep client_max_body_size
            client_max_body_size                    1m;
            client_max_body_size                    1m;
            client_max_body_size                    1m;
            client_max_body_size                    1m;
            client_max_body_size                    21m;

无论我在哪里尝试改变它。在全局或入口路由的配置Map上.......这个值永远不会改变。

gg58donl

gg58donl8#

我可以在修改配置Map后通过重新部署nginx入口控制器来修复它。

kubectl patch deployment your_deployment -p "{\"spec\": {\"template\": {\"metadata\": { \"labels\": {  \"redeploy\": \"$(date +%s)\"}}}}}"

相关问题