我有一个应用程序,该应用程序有两个k8s部署,分别称为onboarding-server
和frontend
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
答案 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服务的前面。希望对您有帮助!