簡體   English   中英

Kubernetes Nginx-ingress如何在Express中處理路由

[英]Kubernetes nginx-ingress how to deal with routing in Express

我有一個運行兩個NodesJS Express應用程序的Azure Kubernetes群集。 我通過nginx-ingress處理傳入的請求

Nginx入口

控制器: https : //raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

服務: https : //raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.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。 直到一切正常。

示例app1

Dockerfile:FROM節點: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>

  1. 如果提交表單,我將被重定向到kubernetesurl.com/auth

    但是我需要kubernetesurl.com/app1/auth。

  2. 如果我在'/'內使用response.redirect('/ home')則會重定向到kubernetesurl.com/home

    但是我需要kubernetesurl.com/app1/home。

  3. 如果我將帶有相對URL的鏈接添加到home之類的index.html, 則會重定向到kubernetesurl.com/home

    但是我需要kubernetesurl.com/app1/home。

當我開始在VM上將Express表示為服務時,一切正常(當然,因為該應用程序在不帶代理的情況下在“ /”上運行)。

如何通過代理運行它?

由於您有兩個不同的位置,指向兩個不同的服務,因此可以嘗試對相對URL進行分組和重寫。

annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /app$2/$3
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /(location)(1)/(.*)
        backend:
          serviceName: service1
          servicePort: 80
      - path: /(location)(2)/(.*)
        backend:
          serviceName: service2
          servicePort: 80

因此,基本上,您只使用第一個組( location1location2 )路由到Ingress級別的正確服務。

然后,可以通過重寫規則來消除該組,該規則將僅保留第二組來重寫正確的應用程序編號,而第三組則將您傳遞給URL的其他所有內容進行野匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM