kubernetes - 后端服务的问题子路径入口控制器
问题描述
我在为后端服务设置路径入口控制器时遇到问题。例如我想要设置:
- 带角度的前端应用程序(路径:/)
- 使用 NodeJs 的后端服务(路径:/webservice)。
NodeJS:索引.js
const express = require('express')
const app = express()
const port = 4000
app.get('/', (req, res) => res.send('Welcome to myApp!'))
app.use('/data/office', require('./roffice'));
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
另一条路线:roffice.js
var express = require('express')
var router = express.Router()
router.get('/getOffice', async function (req, res) {
res.send('Get Data Office')
});
module.exports = router
部署.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ws-stack
spec:
selector:
matchLabels:
run: ws-stack
replicas: 2
template:
metadata:
labels:
run: ws-stack
spec:
containers:
- name: ws-stack
image: wsstack/node/img
imagePullPolicy: IfNotPresent
ports:
- containerPort: 4000
服务.yaml
apiVersion: v1
kind: Service
metadata:
name: service-wsstack
labels:
run: service-wsstack
spec:
type: NodePort
ports:
- port: 80
protocol: TCP
nodePort: 30009
targetPort: 4000
selector:
run: ws-stack
入口.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: stack-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: hello-world.info
- http:
paths:
- path: /
backend:
serviceName: service-ngstack --> frondend
servicePort: 80
- path: /webservice
backend:
serviceName: service-wsstack --> backend
servicePort: 80
我成功设置了部署、服务和入口。但是当我用 curl 打电话时
curl http://<minikubeip>/webservice --> Welcome to myApp! => Correct
curl http://<minikubeip>/webservice/data/office/getOffice --> Welcome to myApp! => Not correct
如果我调用另一条路线,结果是相同的“欢迎使用 myApp”。但是如果我使用 Nodeport
curl http://<minikubeip>:30009/data/office/getOffice => 'Get Data Office', working properly.
问题是什么?任何解决方案?谢谢
解决方案
TL;博士
nginx.ingress.kubernetes.io/rewrite-target: /$2
path: /webservice($|/)(.*)
解释
问题出在入口处的那一行:
nginx.ingress.kubernetes.io/rewrite-target: /
您是在告诉 nginx 将您的 url 重写为/
匹配的任何内容。
/webservice
=>/
/webservice/data/office/getOffice
=>/
要做你想做的事情,请使用 regex,这是一个简单的例子:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: stack-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: hello-world.info
- http:
paths:
- path: /
backend:
serviceName: service-ngstack --> frondend
servicePort: 80
- path: /webservice($|/)(.*)
backend:
serviceName: service-wsstack --> backend
servicePort: 80
这样你就要求 nginx 用第二个匹配组重写你的 url。最后它给你:
/webservice
=>/
/webservice/data/office/getOffice
=>/data/office/getOffice
推荐阅读
- dialogflow-es - Twitter dialogflow 开源集成
- javascript - 从 javascript/Ajax 调用 Laravel 函数 - Dropzone.js & Laravel
- javascript - 如何在嵌套(猫鼬)回调中更改 json 值
- firebase - Firebase 安全规则:`if false` 是可选的吗?
- google-apps-script - 更新谷歌表单
- c# - 安全加载松散的 XAML 绘图
- python - 如何使用scrapy从未知的第n个孩子p标签中获取文本?
- c++ - STL map.find 返回所有元素
- python - Discord.py 在命令执行后提及角色
- java - 将数字移到字符串递归Java的开头