Error 502 con nginx-ingress en Kubernetes al punto final personalizado

Error 502 con nginx-ingress en Kubernetes al punto final personalizado

Tengo una entrada que se dirige a un punto final personalizado externo al clúster de Kubernetes. El servicio escucha solo en HTTPS en el puerto 8006.

apiVersion: v1
kind: Service
metadata:
  name: pve
spec:
  ports:
    - protocol: TCP
      port: 8006
---
apiVersion: v1
kind: Endpoints
metadata:
  name: pve
subsets:
  - addresses:
      - ip: 10.0.1.2
    ports:
      - port: 8006
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: pve

  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/auth-tls-verify-client: "off"
    nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/16"

spec:
  tls:
    - hosts:
        - pve.example.com
      secretName: pve-tls
  rules:
    - host: pve.example.com
      http:
        paths:
          - backend:
              serviceName: pve
              servicePort: 8006
            path: /

Da el error en el pod nginx:

10.0.0.25 - - [28/ago/2020:01:17:58 +0000] "GET / HTTP/1.1" 502 157 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko /20100101 Firefox/79.0" "-"

2020/08/28 01:17:58 [error] 2609#2609: *569 conexión ascendente cerrada prematuramente al leer el encabezado de respuesta desde el nivel ascendente, cliente: 10.0.0.25, servidor: pve.example.com, solicitud: "GET / HTTP /1.1", ascendente: "http://10.0.1.2:8006/", host: "pve.example.com"

Editar

Después de eliminar el protocolo proxy, aparece el error.

10.0.10.1 - - [28/ago/2020:02:19:18 +0000] "GET / HTTP/1.1" 400 59 "-" "curl/7.58.0" "-"

28/08/2020 02:19:26 [error] 2504#2504: *521 conexión ascendente cerrada prematuramente mientras leía el encabezado de respuesta desde el nivel ascendente, cliente: 10.0.10.1, servidor: pve.example.com, solicitud: "GET / HTTP /1.1", ascendente: "http://10.0.1.2:8006/", host: "pve.example.com"

10.0.10.1 - - [28/ago/2020:02:19:26 +0000] "GET / HTTP/1.1" 502 157 "-" "curl/7.58.0" "-"

 

Y en caso de que sea relevante, mi configuración de nginx, implementada a través del helm charnginx-stable/nginx-ingress

  ## nginx configuration
  ## Ref: https://github.com/kubernetes/ingress/blob/master/controllers/nginx/configuration.md
  ##
  controller:
    config:
      entries:
        hsts-include-subdomains: "false"
        ssl-ciphers: "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"
        ssl-protocols: "TLSv1.1 TLSv1.2"
    ingressClass: nginx
    service:
      externalTrafficPolicy: Local
      annotations:
        metallb.universe.tf/address-pool: default
  defaultBackend:
    enabled: true
  tcp:
    22: "gitlab/gitlab-gitlab-shell:22"

Respuesta1

Esta anotación es probablemente la causa del problema.

    nginx.ingress.kubernetes.io/use-proxy-protocol: "true"

Eldocumentosestado:

Habilita o deshabilita el protocolo PROXY para recibir información de conexión del cliente (dirección IP real) pasada a través de servidores proxy y balanceadores de carga como HAProxy y Amazon Elastic Load Balancer (ELB).

Si no tiene un balanceador de carga frente a su Ingress que esté pasando conexiones usando el protocolo PROXY, entonces esto no es lo que desea y esta anotación no debería estar presente (o debería estar "false").

Respuesta2

Esta es una respuesta wiki de la comunidad. No dudes en ampliarlo.

El error que ve: upstream prematurely closed connection while reading response header from upstreamproviene de Nginx y significa que su "upstream" cerró la conexión.

Es difícil decir cuál podría ser la causa exacta de este problema sin los detalles necesarios, pero lo que puedes hacer de todos modos es intentar aumentar el valor del tiempo de espera de acuerdo conesta documentación, específicamente:

  • proxy_read_timeout

  • proxy_connect_timeout

También puede ajustar el código/configuración en su "upstream", cualquiera que sea su caso de uso.

información relacionada