从 Kubernetes NGINX 入口控制器公开服务总是 return 502 Bad Gateway

Exposing service from Kubernetes NGINX Ingress controller always return 502 Bad Gateway

我在数字海洋中的 kubernetes 集群中请求我的 NodeJS 应用程序 运行 时遇到问题。每个请求returns一个502 Bad Gateway Error。我不确定我错过了什么。

这是服务配置的样子

apiVersion: v1
kind: Service
metadata:
  name:  service-api
  namespace: default
  labels:
    app:  service-api
spec:
  type: ClusterIP
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 3000
  selector:
    app:  service-api

Ingress.yml 看起来像这样

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: service-api-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/limit-connections: '2'
    nginx.ingress.kubernetes.io/limit-rpm: '60'
    service.beta.kubernetes.io/do-loadbalancer-protocol: "http"
    service.beta.kubernetes.io/do-loadbalancer-algorithm: "round_robin"
    service.beta.kubernetes.io/do-loadbalancer-http2-ports: "443,80"
    service.beta.kubernetes.io/do-loadbalancer-tls-ports: "443"
    service.beta.kubernetes.io/do-loadbalancer-tls-passthrough: "true"
spec:
  tls:
  - hosts:
    - dev-api.service.com
    secretName: service-api-tls
  rules:
  - host: "dev-api.service.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: service-api
            port:
              number: 80

每当我访问主机时 url 我都会收到 502 错误。

这是出现在 nginx 入口日志中的内容

2021/01/13 08:41:34 [error] 319#319: *31338 connect() failed (111: Connection refused) while connecting to upstream, client: IP, server: dev-api.service.com, request: "GET /favicon.ico HTTP/2.0", upstream: "http://10.244.0.112:3000/favicon.ico", host: "dev-api.service.com", referrer: "https://dev-api.service.com/status"

无需特殊设置,404 很可能来自您的实际后端。

难道是配置SSL passthru的注解?

如果在入口控制器上配置了 SSL passthru,那么除了端口 80 之外,您的服务还需要公开端口 443。您基本上是在说 pod 正在终止安全连接而不是 nginx。

如果这是问题所在,将解释 50X 错误,这表明后端存在问题

正如我们(与@Emmanuel Amodu)在评论中讨论的那样:

错误是使用错误的端口连接到应用程序,端口 4000 而不是 service-api 中定义的 3000

请遇到类似问题的社区 - 最重要的调试步骤:

  1. 正在检查 netstat -plant 输出 table
  2. 正在检查您的 Nginx 配置:$ kubectl exec -it -n <namespace-of-ingress-controller> <nginx-ingress-controller-pod> -- cat /etc/nginx/nginx.conf
  3. 检查服务:$ kubectl describe svc service-api