繁体   English   中英

Angular、NGINX 无法连接到 Kubernetes 集群上的后端

[英]Angular, NGINX cannot connect to backend on Kubernetes cluster

我正在努力学习K8。 我有一个使用 angular 制作的前端应用程序。 我在 NGINX 代理后面提供它。 我也有一个具有功能的后端。 有我的文件,

nginx.conf

http {
    upstream gateway {
        server sb-gateway:8081;
    }
    include /etc/nginx/mime.types;
    server {
        listen       80;
        sendfile on;
        default_type application/octet-stream;

        location / {
            root   /usr/share/nginx/html;
            try_files $uri $uri/ /index.html;
            index  index.html index.htm;
        }

        location /api/ {
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass http://gateway;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
}

用户服务.ts

...
return this.http.post('/api/login', {data})
...

ui-service.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: sb-ui
  name: sb-ui
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30000
  selector:
    app: sb-ui

后端服务称为sb-gateway ,我正在尝试将所有包含/api/的请求路由到后端(如 NGINX 中指定的那样)。 但是当我尝试从前端点击路线/按下按钮时出现此错误。

POST http://192.168.64.2:30000/api/login 404 (NOT FOUND)

我正在尝试在 minikube 上运行它。 我在前端 pod 中进行了 SSH,并尝试 curl 后端服务。 有用。 我只需要弄清楚我应该如何从 angular 上的前端服务通信到后端服务。

任何帮助将不胜感激!

将此答案发布为社区 wiki,以提供更多关于如何允许/将流量路由到 Kubernetes 集群/中的基线。

随意扩展它。


牢记以下声明:

我正在努力学习K8。

您应该使用Ingress ,而不是使用充当代理的nginx Pod

总之Ingress可以描述为:

管理对集群中服务的外部访问的 API object,通常是 HTTP。

Ingress 可以提供负载平衡、SSL 终止和基于名称的虚拟主机。

-- Kubernetes.io:文档:概念:服务网络:入口

通过Ingress object,您可以告诉您的Ingress controller(在本示例中为nginx-ingress )具有允许您相应地路由流量的特定配置。


以以下情况为例:

  • 您的应用程序应该在/api路径上接收请求
  • 您有其他应接收所有其他请求的应用程序(在此示例中为简单的nginx Pod

具体到:

我正在尝试在 minikube 上运行它。

Minikube已经内置了Ingress插件,可以通过单个命令启用(有一些例外,请参阅具体--driver的文档):

  • $ minikube addons enable ingress

使用上述命令,您将生成nginx-ingress

创建设置以显示如何配置它:

  • $ kubectl create deployment hello --image=gcr.io/google-samples/hello-app:2.0
  • $ kubectl expose deployment hello --port=8080 --type=ClusterIP
  • $ kubectl create deployment nginx --image=nginx
  • $ kubectl expose deployment nginx --port=80 --type=ClusterIP

Ingress资源应如下所示:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-fanout-example
spec:
  ingressClassName: "nginx"
  rules:
  - host:
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: hello 
            port:
              number: 80
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80

上面的Ingress示例将做什么:

  • 使用/api/api//api/xyz等请求:
    • 使用hello Pod路由到hello Service
  • 使用//xyz/abc/xyz等请求:
    • 使用nginx Pod路由到nginx Service

旁注!

如果您需要向Ingress添加一些特定配置,您可以查看此文档:

您可以从hello Pod日志中看到:

2021/04/09 15:22:07 Server listening on port 8080
2021/04/09 15:50:14 Serving request: /api
2021/04/09 15:50:17 Serving request: /api
2021/04/09 15:50:19 Serving request: /api/asdasd

其他资源:

暂无
暂无

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

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