【发布时间】:2019-07-18 19:54:34
【问题描述】:
我有一个 Azure Kubernetes 集群,其中运行了几个 NodesJS Express 应用程序。 我通过 nginx-ingress 处理传入的请求
nginx 入口
控制器:https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
#nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- http:
paths:
- path: /app1(/|$)(.*)
backend:
serviceName: app1-service
servicePort: 80
- path: /app2(/|$)(.*)
backend:
serviceName: app2-service
servicePort: 80
示例 app1-service
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: app1
spec:
replicas: 2
template:
metadata:
labels:
app: app1
spec:
nodeSelector:
"beta.kubernetes.io/os": linux
containers:
- name: nodejs
image: xxx.azurecr.io/app1:v1.0
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
---
kind: Service
apiVersion: v1
metadata:
name: app1-service
spec:
selector:
app: app1
ports:
- port: 80
protocol: TCP
type: NodePort
就像你可以看到 kubernetesurl.com/app1 上的所有流量都被转发到 app1-service。直到一切正常。
示例应用程序1
Docker 文件: 从节点:8 WORKDIR /opt
COPY package.json /opt
RUN npm install
COPY . /opt
CMD ["npm", "start"]
server.js:
app.get('/', function(request, response) {
response.sendFile(path.join(__dirname + '/login.html'));
});
app.post('/auth', function(request, response) {
... some auth stuff
response.redirect('/home');
});
app.get('/home', function(request, response) {
response.sendFile(path.join(__dirname + '/home.html'));
})
login.html:
<form action="auth" method="POST">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<input type="submit">
</form>
问题
-
如果我提交表单,我会被重定向到 kubernetesurl.com/auth。
但我需要 kubernetesurl.com/app1/auth。
-
如果我在 '/' 中使用 response.redirect('/home'),我会被重定向到 kubernetesurl.com/home。
但我需要 kubernetesurl.com/app1/home。
-
如果我向 index.html 添加一个带有相对 url 的链接,比如 home,我会被重定向到 kubernetesurl.com/home。
但我需要 kubernetesurl.com/app1/home。
当我在我的 VM 上启动 express 作为服务时,一切正常(当然,因为应用程序在“/”上运行而无需代理)。
如何通过代理运行它?
【问题讨论】:
标签: node.js express nginx kubernetes