Kubernetes 和 Nginx ingress 控制器出现 413 错误。

53

我正在尝试更改client_max_body_size的值,以便我的NGINX入口不会返回HTTP 413内容过大的错误(如日志中所示)。

我已经测试了几个解决方案。
这是我的配置映射:

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更改此设置?我需要全局更改它,适用于所有我的入口。

8个回答

106
你可以使用注释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"
...

2
我想将它设置为全局变量,但实际上这种方法更好,因为我的YAML文件在项目存储库中。这样就不会丢失。谢谢。 - Djent
1
那么 client-max-body-size 配置行可以完全从 metadata.annotations 中删除吗? - payne
2
@payne 这要看情况。请参考 https://dev59.com/hVUL5IYBdhLWcg3wtp9m#67923692。如果请求体太大,需要使用`client-max-body-size` 来提高性能。详见注释:客户端请求体缓存大小 - Peter
kubectl patch ingress my-ingress -p '{"metadata": {"annotations": {"nginx.ingress.kubernetes.io/proxy-body-size": "0"}}}' - kinjelom
对我来说,它是 nginx.ingress.kubernetes.io/client-body-buffer-size - leonp5

23
这里存在混淆,关于正确的注释是nginx.ingress.kubernetes.io/proxy-body-size还是nginx.org/client-max-body-size。答案是两者都可能使用!
在所有相关人员智慧的指导下,世界上存在两种不同的“NGINX ingresses”。很难确定您正在运行哪个版本,并且谷歌搜索对于区分这两个版本是无用的(但这并不新奇)。
如果您使用官方NGINX Ingress,则正确的注释在此处:https://docs.nginx.com/nginx-ingress-controller/configuration/ingress-resources/advanced-configuration-with-annotations/ 如果您使用基于NGINX的官方Kubernetes Ingress,则正确的注释如下:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#custom-max-body-size 如果您的入口实现的Docker镜像名称为k8s.gcr.io/ingress-nginx/controller,则您使用的是官方Kubernetes版本。通过排除法,您可以确定是否使用了NGINX实现。

我希望所有导致这种混乱状态的人今天都过得很糟糕。而其他的人...保持愉快!


1
这个评论让我在最后一刻开心了:D - Pinak Mazumdar
找出我正在运行的版本的那一部分最终帮了我! - zeisi
更多信息和两个Nginx Ingress的比较可以在Nginx博客中找到。 - izogfif
这应该是答案! - Riki_tiki_tavi

16

若要全局设置,可以查看configmap.md文档。结果显示需要设置的变量是proxy-body-size而不是client-max-body-size

当部署helm chart时,您可以设置--set-string controller.config.proxy-body-size="4m"


8

最近可能有些人遇到了困扰。我们发现注释 nginx.ingress.kubernetes.io/proxy-body-size 不再起作用,正确的注释应该是:

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

希望这能帮助其他人。

1
顺便提一下,这两个注释是针对两个不同的nginx ingress控制器的。前缀中的域名是一个很好的参考。 - Draculater
@Draculater 确实如此。问题在于谷歌搜索将人们发送到了这篇帖子,我认为(可能是错误的),然而这不是正确的问题,这个回答可以缩短他们寻找解决方案的时间。 - Edorka
这个是正确的! - undefined

6

9
对于阅读者而言,本评论适用于使用由NGINX发布的Ingress控制器的情况。如果您正在使用由Kubernetes发布的NGINX控制器,则属性名称仍为proxy-body-size。您可以通过注释键来确定此信息,对于由Kubernetes发布的,注释键将为nginx.ingress.kubernetes.io/xxxxx,而不是NGINX发布的nginx.org/xxxxx - James G
6
我建议Nginx和Kubernetes的人们一起合作,制定一个共同的规范。 - code_monk

2
你可以始终进行全局更改并将其完全禁用。
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"}}'

0

我已经尝试在configmap上使用proxy-body-size和client-max-body-size,并对nginx控制器pod进行了滚动重启,但是当我在pod中grep nginx.conf文件时,它返回默认的1m。我正在Azure Kubernetes Service(AKS)中尝试这样做。我正在与他们的支持人员合作。他们说这不是他们的问题,因为它似乎是一个nginx配置问题。

奇怪的是,我们在Azure中有其他集群,这不是一个问题,直到我们发现这个问题与一些新的部署有关。他们提出的最初解决方案就是这个线程中的内容,但它拒绝改变。

以下是我的configmap:

# 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 rollout restart deployment/nginx-nginx-ingress-controller -n ingress-nginx

在 nginx ingress controller pod 中使用 grep 查询现在的值:

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;

无论我在哪里尝试更改它,在全局的configmap或特定的Ingress路由上......上面的这个值从未改变过。

我可以确认,我们遇到了完全相同的问题。AKS版本为1.18.4。 - Patrick P.
似乎在Ingress上添加nginx.ingress.kubernetes.io/proxy-body-size: "50m"注释会更新nginx控制器配置文件中的“client_max_body_size”值。 - Somnath Pawar

0

我可以通过修改configmap后重新部署nginx-ingress控制器来解决它。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接