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

时间:2020-04-14 22:27:42

标签: node.js nginx kubernetes nginx-reverse-proxy nginx-config

我有一个应用程序,该应用程序有两个k8s部署,分别称为onboarding-serverfrontend onboarding-server是节点服务器,前端是使用Nginx构建和部署的React应用程序。

这是我运行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命令进入容器时,我可以使用

来获得适当的响应。
curl http://192.168.5.21/api/onboarding/v1/user/login

2 个答案:

答案 0 :(得分:1)

对于Kubernetes中基于路径的路由,建议您查看 Ingress 。您可以将 Nginx Ingress 用于Kubernetes。您将能够基于路径来映射服务。

例如,

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用作反向代理,因此您可以将后端服务公开为Type NodePort,并使用后端服务的外部IP,而不必使用服务名称-

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

答案 1 :(得分:0)

在您的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服务的前面。希望对您有帮助!