[英]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.