繁体   English   中英

如何将前端连接到 K8S 中的后端?

[英]How to connect frontend to backed in K8S?

我有一个应用程序,它有两个名为 onboarding onboarding-server k8s 部署, frontend onboarding-server 是一个节点服务器,前端是一个 react 应用程序,它是使用 Nginx 构建和部署的。

这是我运行kubectl get all时返回的片段

NAME                                       READY   STATUS    RESTARTS   AGE
pod/frontend-deployment-578f898ffb-cc7gc   1/1     Running   0          15s
pod/node-deployment-7f4754fdf5-fnmls       1/1     Running   0          7d10h

NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
service/frontend-service    LoadBalancer   10.100.200.64    10.167.198.105   80:31167/TCP     13d
service/node-service   LoadBalancer   10.100.200.71    10.167.199.136   3200:32276/TCP   13d

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/frontend-deployment   1/1     1            1           5d12h
deployment.apps/node-deployment       1/1     1            1           7d10h

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/frontend-deployment-578f898ffb   1         1         1       17s
replicaset.apps/node-deployment-7f4754fdf5       1         1         1       7d10h

我的nginx.conf配置看起来像这样

upstream node-service{
  server node-service;
}

server {

    listen 80;

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


    location = /api {
      proxy_pass http://node-service;
    }

    error_page 404 /index.html;
    location = / {
      root /usr/share/nginx/html;
      internal;
    }

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

现在我尝试使用这个 URL 从前端与我的后端服务交谈

/api/onboarding/v1/user/login

我对 Nginx 的理解是,当我请求/api时,它应该将我重定向到http://node-service/api/onboarding/v1/user/login ,因此应该返回适当的响应。 但我得到的是

Fetch failed loading: POST
 http://192.168.5.21/api/onboarding/v1/user/login

如何从 Nginx 连接到节点服务?

编辑 1:我忘记提及的一件事是,当我使用exec命令在容器内 go 时,我能够使用

curl http://192.168.5.21/api/onboarding/v1/user/login

对于 Kubernetes 中的基于路径的路由,我建议您看一下Ingress 在您的情况下,您可以使用Nginx Ingress for kubernetes。 您将能够基于路径获得 map 服务。

例如,

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: demo-ingress
  annotations: {
    'kubernetes.io/ingress.class': nginx
  }
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        backend:
          serviceName: demo-backend
          servicePort: 80

现在,当您使用 nginx 作为反向代理时,您可以将后端服务公开为类型 NodePort 并使用后端服务的外部 IP 而不是使用服务名称 -

location = /api {
  proxy_pass http://external-ip:port;
}

在您的 FE 中,您可以部署此配置:

server {
  listen 80;

  location / {
        include /etc/nginx/mime.types;
        try_files $uri $uri/ /index.html;
  }

  location /be-svc/ {
        proxy_pass "http://<be-svc>.<namespace>/";
  }
}

之后你的Dockerfile可以是这样的:

FROM nginx:1.14

COPY build /usr/share/nginx/html
RUN rm /etc/nginx/conf.d/default.conf

COPY config/nginx/sites-available/api.conf /etc/nginx/conf.d

只需像往常一样将入口放在您的 FE 服务前面。 希望能帮助到你!

暂无
暂无

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

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