繁体   English   中英

Nginx 入口在 Kubernetes 上返回 502 Bad Gateway

[英]Nginx Ingress returns 502 Bad Gateway on Kubernetes

我在 AWS (EKS) 上部署了一个 Kubernetes 集群。 我使用“eksctl”命令行工具部署了集群。 我正在尝试在集群上部署 Dash python 应用程序但没有成功。 Dash 的默认端口是 8050。对于部署,我使用了以下资源:

  • 服务(ClusterIP 类型)
  • 入口

您可以检查以下资源配置文件:

吊舱配置文件.yml

kind: Pod
apiVersion: v1
metadata:
  name: dashboard-app
  labels:
    app: dashboard
spec:
  containers:
    - name: dashboard
      image: my_image_from_ecr
      ports:
        - containerPort: 8050

服务配置文件.yml

kind: Service
apiVersion: v1
metadata:
  name: dashboard-service
spec:
  selector:
    app: dashboard
  ports:
    - port: 8050 # exposed port
      targetPort: 8050

ingress-configuration-file.yml(基于主机的路由)

kind: Ingress
metadata:
  name: dashboard-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: dashboard.my_domain
    http:
      paths:
      - backend:
          serviceName: dashboard-service
          servicePort: 8050
        path: /

我按照以下步骤操作:

kubectl apply -f pod-configuration-file.yml
kubectl apply -f service-configuration-file.yml
kubectl apply -f ingress-confguration-file.yml

我还注意到 pod 部署按预期工作:

kubectl logs my_pod:

output 是:

Dash is running on http://127.0.0.1:8050/

 Warning: This is a development server. Do not use app.run_server
 in production, use a production WSGI server like gunicorn instead.

 * Serving Flask app "annotation_analysis" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on

您可以从入口配置文件中看到我想使用我的域进行基于主机的路由。 为此,我还部署了一个 nginx-ingress。 我还使用 Route53 创建了一个“A”记录集,将“dashboard.my_domain”映射到 nginx-ingress:

kubectl get ingress

output 是:

NAME                           HOSTS                                            ADDRESS.           PORTS.   AGE                                                            
dashboard-ingress         dashboard.my_domain                  nginx-ingress.elb.aws-region.amazonaws.com   80      93s

而且,

kubectl describe ingress dashboard-ingress

output 是:

Name:             dashboard-ingress
Namespace:        default
Address:          nginx-ingress.elb.aws-region.amazonaws.com
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host                                            Path  Backends
  ----                                            ----  --------
  host.my-domain  
                                              /   dashboard-service:8050 (192.168.36.42:8050)
Annotations:                                      
nginx.ingress.kubernetes.io/force-ssl-redirect: false
                                              
nginx.ingress.kubernetes.io/rewrite-target: /
                                              
nginx.ingress.kubernetes.io/ssl-redirect: false
Events:                                           <none>

不幸的是,当我尝试在浏览器上访问 Dash 应用程序时,我从 nginx 收到502 Bad Gateway错误。 你能帮我吗,因为我的 Kubernetes 知识有限。 提前致谢。

它与 Kubernetes 或 AWS 设置无关。 我不得不从以下位置更改我的 python Dash 代码:

if __name__ == "__main__":
    app.run_server(debug=True)

至:

if __name__ == "__main__":
    app.run_server(host='0.0.0.0',debug=True).

添加host='0.0.0.0'就成功了!

我认为您需要检查是否在同一主机上的路径/上公开了任何其他服务。

其次,尝试删除rewrite-target注释。 您还可以使用 kubectl kubectl describe ingress <ingress_Name>的 output 更新您的问题吗

我还建议您使用值为HTTP backend-protocol注释(默认值,如果仪表板应用程序未配置 SSL,则可以避免使用此功能,并且只有此应用程序在所述主机上提供服务。)但是,您可能需要add this if multiple applications are served at this host, and create one Ingress with backend-protocol: HTTP for non SSL services, and another with backend-protocol: HTTPS to serve traffic to SSL enabled services.

有关backend-protocol注释的更多信息,请参阅链接。

我在 Ingress Setup 中经常遇到这个问题,这些步骤帮助我解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM