【问题标题】:Angular, NGINX cannot connect to backend on Kubernetes clusterAngular,NGINX 无法连接到 Kubernetes 集群上的后端
【发布时间】:2023-03-14 17:10:01
【问题描述】:

我正在努力学习 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;
        }
    }
}

user.service.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,并尝试卷曲后端服务。有用。我只需要弄清楚我应该如何在 Angular 上从前端服务到后端服务进行通信。

任何帮助将不胜感激!

【问题讨论】:

  • 我建议使用 nginx ingress 而不是手动配置代理。
  • 我需要同意 jordanm 的评论。您应该使用 Ingress nginx 而不是安装了 nginx 的单个 Pod。你有没有偶然看到这个答案:stackoverflow.com/questions/66641786/…

标签: angular nginx kubernetes


【解决方案1】:

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

请随意扩展。


记住以下声明:

我正在努力学习 K8。

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

简而言之Ingress可以描述为:

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

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

-- Kubernetes.io: Docs: Concepts: Services networking: Ingress

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


以下列情况为例:

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

具体到:

我正在尝试在 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 Servicehello Pod
  • 通过//xyz/abc/xyz等请求:
    • 路由到nginx Servicenginx Pod

附注!

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

你可以从helloPod日志中看到:

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

其他资源:

【讨论】:

    猜你喜欢
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2020-06-10
    • 2018-12-28
    • 2020-08-15
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多