【问题标题】:Exposing service from Kubernetes NGINX Ingress controller always return 502 Bad Gateway从 Kubernetes NGINX 入口控制器公开服务总是返回 502 Bad Gateway
【发布时间】:2023-03-15 00:44:01
【问题描述】:

我在请求运行在数字海洋中的 kubernetes 集群中的 NodeJS 应用程序时遇到问题。每个请求都返回一个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"

【问题讨论】:

  • 你能分享一下 netstat -plant 输出表吗?
  • @Malgorzata 我不知道如何在 kubernetes 中做到这一点。但从日志看来,请求10.244.0.112中的内部IP与服务的集群IP不匹配。
  • 只需在节点命令行netstat -plant中执行该命令即可。还提供 Nginx 配置的输出: $ kubectl exec -it -n -- cat /etc/nginx/nginx.conf
  • 你还能粘贴命令 $ kubectl describe svc service-api 的输出吗?

标签: node.js kubernetes websocket digital-ocean nginx-ingress


【解决方案1】:

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

【讨论】:

  • true 但在我的本地机器上 websocket 连接正常。
【解决方案2】:

会不会是配置SSL passthru的注解?

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

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

【讨论】:

  • 我不确定是不是这个问题。
【解决方案3】:

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

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

对于会有类似问题的社区,请 - 最重要的调试步骤:

  1. 检查 netstat -plant 输出表
  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

【讨论】:

    猜你喜欢
    • 2021-09-11
    • 2020-05-09
    • 2019-09-15
    • 1970-01-01
    • 2020-06-14
    • 2019-08-24
    • 2021-02-24
    • 2019-02-26
    • 2018-01-20
    相关资源
    最近更新 更多