Nginx Ingress在Kubernetes上返回502个坏网关

Nginx Ingress在Kubernetes上返回502个坏网关,kubernetes,kubectl,plotly-dash,nginx-ingress,amazon-eks,Kubernetes,Kubectl,Plotly Dash,Nginx Ingress,Amazon Eks,我在AWS(EKS)上部署了一个Kubernetes集群。我使用“eksctl”命令行工具部署了集群。我试图在集群上部署Dash python应用程序,但没有成功。Dash的默认端口是8050。对于部署,我使用了以下资源: 豆荚 服务(群集类型) 入口 您可以检查以下资源配置文件: pod配置文件.yml kind: Pod apiVersion: v1 metadata: name: dashboard-app labels: app: dashboard spec:

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

  • 豆荚
  • 服务(群集类型)
  • 入口
您可以检查以下资源配置文件:

pod配置文件.yml

kind: Pod
apiVersion: v1
metadata:
  name: dashboard-app
  labels:
    app: dashboard
spec:
  containers:
    - name: dashboard
      image: my_image_from_ecr
      ports:
        - containerPort: 8050
kind: Service
apiVersion: v1
metadata:
  name: dashboard-service
spec:
  selector:
    app: dashboard
  ports:
    - port: 8050 # exposed port
      targetPort: 8050
服务配置文件.yml

kind: Pod
apiVersion: v1
metadata:
  name: dashboard-app
  labels:
    app: dashboard
spec:
  containers:
    - name: dashboard
      image: my_image_from_ecr
      ports:
        - containerPort: 8050
kind: Service
apiVersion: v1
metadata:
  name: dashboard-service
spec:
  selector:
    app: dashboard
  ports:
    - port: 8050 # exposed port
      targetPort: 8050
ingres-configuration-file.yml(基于主机的路由)

我遵循以下步骤:

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:
输出为:

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
NAME                           HOSTS                                            ADDRESS.           PORTS.   AGE                                                            
dashboard-ingress         dashboard.my_domain                  nginx-ingress.elb.aws-region.amazonaws.com   80      93s
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>
您可以从入口配置文件中看到,我希望使用我的域执行基于主机的路由。为此,我还部署了一个nginx入口。我还使用Route53创建了一个“A”记录集 将“dashboard.my_domain”映射到nginx入口:

kubectl get ingress
输出为:

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
NAME                           HOSTS                                            ADDRESS.           PORTS.   AGE                                                            
dashboard-ingress         dashboard.my_domain                  nginx-ingress.elb.aws-region.amazonaws.com   80      93s
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>
而且

kubectl describe ingress dashboard-ingress
输出为:

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
NAME                           HOSTS                                            ADDRESS.           PORTS.   AGE                                                            
dashboard-ingress         dashboard.my_domain                  nginx-ingress.elb.aws-region.amazonaws.com   80      93s
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>
名称:仪表板入口
名称空间:默认值
地址:nginx-ingres.elb.aws-region.amazonaws.com
默认后端:默认http后端:80()
规则:
主机路径后端
----                                            ----  --------
host.my-domain
/仪表板服务:8050(192.168.36.42:8050)
注释:
nginx.ingres.kubernetes.io/force-ssl-redirect:false
nginx.ingres.kubernetes.io/rewrite-target:/
nginx.ingres.kubernetes.io/ssl-redirect:false
活动:
不幸的是,当我尝试在浏览器上访问Dash应用程序时,我得到了一个 502 nginx错误网关错误。你能帮帮我吗,因为我的库伯内特知识有限。
提前感谢。

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

其次,尝试删除
重写目标
注释。另外,您是否可以使用
kubectl descripe intres

我还建议您使用
后端协议
注释,值为
HTTP
(默认值,如果仪表板应用程序未配置SSL,并且只有此应用程序在所述主机上提供服务,则可以避免使用此注释)。但是,如果此主机上提供多个应用程序,则可能需要添加此注释,并使用
后端协议:HTTP
为非SSL服务创建一个入口,使用
后端协议:HTTPS
创建另一个入口,为启用SSL的服务提供流量

有关
后端协议
注释的更多信息,请参阅链接


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

它与Kubernetes或AWS设置无关。我不得不将python Dash代码更改为:

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


添加host='0.0.0.0'成功了

你好,adityajalkhare。谢谢你帮助我。我删除了重写目标注释。此外,在/上没有其他服务公开,但问题没有得到解决。我刚刚添加了“kubectl描述入口”输出。希望有帮助。试着点击一下你的仪表盘URL,看看Nginx入口控制器吊舱的日志。如果出现问题,我通常会在那里收到错误消息。你能核对两件事吗。您的ingres.yml和
kubectl description ingres
命令中的域是不同的,可能是在为public概括输出时出错了。2.尝试在一些其他上下文路径(如
/dashboard
)上配置仪表板服务/应用程序,然后tryIt会充满“连接被拒绝”消息。我很少使用AWS,但我曾经在其中一个安全选项卡中设置规则,以允许特定端口上的通信,请检查这是否被阻止或允许。我真的不记得一年多以前的事了,也许你能理解我想说的话。我主要是在做AKS,对不起@啊,是的!代码中未定义主机。很高兴你成功了!您如何检查您的服务?我在浏览器上键入dashboard.my_域。请参阅“kubectl进入”。这个问题真的很奇怪。对于“Flask服务器(端口5000)”,我遵循了完全相同的过程,它可以正常工作。谢谢你的帮助。