Ingress NGINX для приложений с автоматическим просмотром (gitlab-managed-apps) очень медленный, если был опубликован большой json

Я испытываю странное поведение Ingress-Nginx, если я публикую полезные данные больше 50 КБ. Если это так, время пересылки отправленного пост-запроса в Nginx занимает до 50 секунд или больше, но если я отправляю меньшую меньшую нагрузку, Nginx пересылает очень быстро. Если я отправлю запрос размером 4 МБ, это займет до 100 секунд.

Environemnt: - Кластер Baremetall kubernetes с 3 узлами с Ubuntu 16.04 - развертывание с использованием настраиваемых шаблонов helm вне gitlab - управляемый gitlab модуль контроллера Nginx, маршрутизация прокси по заголовку хоста - приложение Java получает сообщение и возвращает его

Топология приложения: Интернет -> (обратный прокси apache) -> (IngressNginx) -> (Приложение) Я вижу, что apache пересылает всю полезную нагрузку прямо вперед, а модуль Nginx получает его немедленно, но модуль приложения не получает ничего до 50 секунд (зависит от размера полезной нагрузки), иногда я также сталкиваюсь с Nginx 502, но не могу найти шаблон.

Я пробовал увеличить или уменьшить размер буфера, отключил или включил буферизацию, но без каких-либо эффектов:

    nginx.ingress.kubernetes.io/proxy-body-size: "100M"
    nginx.ingress.kubernetes.io/client-body-buffer-size: "5M"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    nginx.ingress.kubernetes.io/proxy-buffer-size: "5M"
    nginx.ingress.kubernetes.io/proxy-request-buffering: "on"
    nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "1"

ingress.yaml шаблон:

{{- if .Values.ingress.enabled -}}
{{- $fullName := include "integrity-adapter-autodeployment.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
  name: {{ $fullName }}
  labels:
    {{- include "integrity-adapter-autodeployment.labels" . | nindent 4 }}
  {{- with .Values.ingress.annotations }}
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: "100M"
    nginx.ingress.kubernetes.io/client-body-buffer-size: "5M"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    nginx.ingress.kubernetes.io/proxy-buffer-size: "5M"
    nginx.ingress.kubernetes.io/proxy-request-buffering: "on"
    nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "1"
    {{- toYaml . | nindent 4 }}
  {{- end }}
spec:
{{- if .Values.ingress.tls }}
  tls:
  {{- range .Values.ingress.tls }}
    - hosts:
      {{- range .hosts }}
        - {{ . | quote }}
      {{- end }}
      secretName: {{ .secretName }}
  {{- end }}
{{- end }}
  rules:
  {{- range .Values.ingress.hosts }}
    - host: {{ .host | quote }}
      http:
        paths:
        {{- range .paths }}
          - path: {{ . }}
            backend:
              serviceName: {{ $fullName }}
              servicePort: {{ $svcPort }}
        {{- end }}
  {{- end }}
{{- end }}

nginx.conf только для этого сервера:

    ## start server feature-document-response-integrity-adapter.prod.semanticlab.net
    server {
        server_name feature-document-response-integrity-adapter.prod.semanticlab.net ;

        listen 80  ;
        listen 443  ssl http2 ;

        set $proxy_upstream_name "-";

        ssl_certificate_by_lua_block {
            certificate.call()
        }

        location ~* "^/" {

            set $namespace      "default";
            set $ingress_name   "review-integrity-adapter-feature-document-response";
            set $service_name   "review-integrity-adapter-feature-document-response";
            set $service_port   "63016";
            set $location_path  "/";

            rewrite_by_lua_block {
                lua_ingress.rewrite({
                    force_ssl_redirect = false,
                    ssl_redirect = true,
                    force_no_ssl_redirect = false,
                    use_port_in_redirects = false,
                })
                balancer.rewrite()
                plugins.run()
            }

            # be careful with `access_by_lua_block` and `satisfy any` directives as satisfy any
            # will always succeed when there's `access_by_lua_block` that does not have any lua code doing `ngx.exit(ngx.DECLINED)`
            # other authentication method such as basic auth or external auth useless - all requests will be allowed.
            #access_by_lua_block {
            #}

            header_filter_by_lua_block {
                lua_ingress.header()
                plugins.run()
            }

            body_filter_by_lua_block {
            }

            log_by_lua_block {
                balancer.log()

                monitor.call()

                plugins.run()
            }

            port_in_redirect off;

            set $balancer_ewma_score -1;
            set $proxy_upstream_name "default-review-integrity-adapter-feature-document-response-63016";
            set $proxy_host          $proxy_upstream_name;
            set $pass_access_scheme  $scheme;

            set $pass_server_port    $server_port;

            set $best_http_host      $http_host;
            set $pass_port           $pass_server_port;

            set $proxy_alternative_upstream_name "";

            client_max_body_size                    100M;

            client_body_buffer_size                 5M;

            proxy_set_header Host                   $best_http_host;

            # Pass the extracted client certificate to the backend

            # Allow websocket connections
            proxy_set_header                        Upgrade           $http_upgrade;

            proxy_set_header                        Connection        $connection_upgrade;

            proxy_set_header X-Request-ID           $req_id;
            proxy_set_header X-Real-IP              $remote_addr;

            proxy_set_header X-Forwarded-For        $remote_addr;

            proxy_set_header X-Forwarded-Host       $best_http_host;
            proxy_set_header X-Forwarded-Port       $pass_port;
            proxy_set_header X-Forwarded-Proto      $pass_access_scheme;

            proxy_set_header X-Scheme               $pass_access_scheme;

            # Pass the original X-Forwarded-For
            proxy_set_header X-Original-Forwarded-For $http_x_forwarded_for;

            # mitigate HTTPoxy Vulnerability
            # https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/
            proxy_set_header Proxy                  "";

            # Custom headers to proxied server

            proxy_connect_timeout                   5s;
            proxy_send_timeout                      300s;
            proxy_read_timeout                      60s;

            proxy_buffering                         on;
            proxy_buffer_size                       5M;
            proxy_buffers                           4 5M;

            proxy_max_temp_file_size                1024m;

            proxy_request_buffering                 on;
            proxy_http_version                      1.1;

            proxy_cookie_domain                     off;
            proxy_cookie_path                       off;

            # In case of errors try the next upstream server before returning an error
            proxy_next_upstream                     error timeout;
            proxy_next_upstream_timeout             0;
            proxy_next_upstream_tries               1;

            proxy_pass http://upstream_balancer;

            proxy_redirect                          off;

        }

    }
    ## end server feature-document-response-integrity-adapter.prod.semanticlab.net
    ```

Does some have any suggestions for me?
Thanks in advance

person Sandro Hörler    schedule 16.06.2020    source источник
comment
Такие вопросы лучше всего задавать разработчикам nginx ingress непосредственно на nginx ingress репозитории guthub.   -  person Matt    schedule 17.06.2020


Ответы (1)


После недели поиска проблемы мы наконец нашли ее ... Ingress-Nginx по умолчанию использует сжатие gzip. Создание configMap с use-gzip: "false" устранило проблему.

kubectl apply -f {configmap.yaml}

apiVersion: v1
data:
 use-gzip: "false"
kind: ConfigMap
metadata:
  labels:
    app: nginx-ingress
    component: controller
    heritage: Tiller
    release: ingress
  name: ingress-nginx-ingress-controller
  namespace: gitlab-managed-apps

person Sandro Hörler    schedule 17.06.2020