Tenho uma entrada que direciona para um endpoint personalizado externo ao cluster Kubernetes. O serviço escuta apenas HTTPS na porta 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: /
Dá o erro no 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" "-"
28/08/2020 01:17:58 [erro] 2609 # 2609: * 569 upstream fechou conexão prematuramente ao ler o cabeçalho de resposta do upstream, cliente: 10.0.0.25, servidor: pve.example.com, solicitação: "GET / HTTP /1.1", upstream: "http://10.0.1.2:8006/", host: "pve.example.com"
Editar
Depois de remover o protocolo proxy, recebo o erro
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 [erro] 2504 # 2504: * 521 upstream fechou conexão prematuramente ao ler o cabeçalho de resposta do upstream, cliente: 10.0.10.1, servidor: pve.example.com, solicitação: "GET / HTTP /1.1", upstream: "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" "-"
E caso seja relevante, minha configuração nginx, implantada através do 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"
Responder1
Esta anotação é provavelmente a causa do problema.
nginx.ingress.kubernetes.io/use-proxy-protocol: "true"
Odocumentosestado:
Habilita ou desabilita o protocolo PROXY para receber informações de conexão do cliente (endereço IP real) passadas por servidores proxy e balanceadores de carga, como HAProxy e Amazon Elastic Load Balancer (ELB).
Se você não tem um balanceador de carga na frente do seu Ingress que está passando conexões usando o protocolo PROXY, então não é isso que você deseja e esta anotação não deve estar presente (ou deveria estar "false"
).
Responder2
Esta é uma resposta do wiki da comunidade. Sinta-se à vontade para expandi-lo.
O erro que você vê: upstream prematurely closed connection while reading response header from upstream
vem do Nginx e significa que a conexão foi fechada pelo seu "upstream".
É difícil dizer qual pode ser a causa exata desse problema sem os detalhes necessários, mas o que você pode fazer de qualquer maneira é tentar aumentar o valor do tempo limite de acordo comesta documentação, especificamente:
proxy_read_timeout
proxy_connect_timeout
Você também pode ajustar o código/configuração no seu "upstream", seja qual for o seu caso de uso.