Jaraws
Jaraws

Reputation: 681

Can we NOT set nginx.ingress.kubernetes.io/client-body-timeout: '120' using ingress annotations?

The default value of said annotation is 60 sec; I am looking to change its value to 120 sec. I added this as an annotation in ingress resource file but it doesn't seem to be working.

Since my request body is quite big, I am getting 408 from ingress http server immediately after 60 sec only;

Where else I can define this annotation if it is not allowed in ingress file itself?

The following page doesn't mention this annotation; Is it because it is not meant to be added as an annotation?

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations

Ingress resource snippet:

kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /my-app
    nginx.ingress.kubernetes.io/client-header-buffer-size: "1M"
    nginx.ingress.kubernetes.io/client-header-timeout: "60"
    nginx.ingress.kubernetes.io/client-body-buffer-size: "1M"
    nginx.ingress.kubernetes.io/client-body-timeout: "120"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/configuration-snippet: |
        proxy_set_header custom-header $1;
spec:
  rules:
  - http:
      paths:
      - path: /(UK)/my-app/(.*)$
        backend:
          serviceName: test
          servicePort: 80

Upvotes: 1

Views: 2273

Answers (2)

Jaraws
Jaraws

Reputation: 681

Adding to HelloWorlds answer, if someone is looking to provide this annotation globally with Kubernetes version of Ingress then following steps could be followed:

  1. Check in which namespace ingress pod is running. Mostly the namespace name will be something like -ingress-some-string-.

    $ kubectl get ns

    Lets say the namespace is: 'ingress-nginx'

  2. Now that namespace is known, check pods inside that namespace.

    $ kubectl get pods -n ingress-nginx

    Lets say you get a pod something like: 'ingress-nginx-controller-abcdefg'

  3. Check the configmap this pod is using the following command:

    $ kubectl get pod ingress-nginx-controller-abcdefg -n ingress-nginx -o yaml | grep configmap

    You will get an output something like: --configmap=${POD_NAMESPACE}/nginx-configuration

  4. Now, you have to create a config map with above name with required and supported configurations by Kubernetes Ingress.

    $ cat global-configmap.yaml


    apiVersion: v1

    kind: ConfigMap

    meta:

     name: nginx-configuration
    
     namespace: ingress-nginx
    

    data:

     client-body-timeout: "120"   # default value is 60 seconds
    
  5. Now, apply this config map yaml.

    $ kubectl apply -f global-configmap.yaml

Upvotes: 1

Matt
Matt

Reputation: 8152

To summarize our conversation in comments:

There are two Nginx ingress controllers; One nginx controller is maintained by kubernetes community and the other one by nginx (the company behind nginx product). Here is the github repo for Nginx ingress controller and and here for kubernetes nginx controller.


Nginx controller provided by kubernetes doesn't allow setting client-body-timeout with annotation. Here is a link to github repo with annotations code. This means that what you are left with is either

  • setting this parameter globally, or
  • opening feature request on github and waiting for someone to implement it.

client-body-timeout parameter can only be set through global config (as specified in documentation).

Upvotes: 1

Related Questions