【问题标题】:Problem Sub Path Ingress Controller for Backend Service后端服务的问题子路径入口控制器
【发布时间】:2020-01-17 19:28:41
【问题描述】:

我在为后端服务设置路径入口控制器时遇到问题。例如我想要设置:

  1. 带角度的前端应用程序(路径:/)
  2. NodeJs 后端服务(路径:/webservice)。

NodeJS : Index.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

Deployment.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

Service.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

ingress.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.

有什么问题?任何解决方案?谢谢

【问题讨论】:

    标签: kubernetes kubernetes-ingress


    【解决方案1】:

    TL;DR

    • nginx.ingress.kubernetes.io/rewrite-target: /$2
    • path: /webservice($|/)(.*)

    说明

    问题出在你入口的那一行:

    nginx.ingress.kubernetes.io/rewrite-target: /

    您是在告诉 nginx 将您的 url 重写为 / 匹配的任何内容。

    • /webservice => /
    • /webservice/data/office/getOffice => /

    要做你想做的事使用正则表达式,下面是一个简单的例子:

     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

    【讨论】:

    • 我很抱歉@Noe..frontend service-ngstack 无法再访问,后端工作正常.. 路径前端有什么解决方案吗?
    • 前端应该在'/'处工作。它以前有效吗?问题是你的前端的 url 将永远是'/'(在这个配置中)。所以我建议你编写自己的正则表达式来匹配 url 并有一个逻辑第二组。或者,如果您想要快速修复,您可以对路径执行与 Web 服务相同的操作
    • 我很抱歉,这工作..我的坏..谢谢@Noe。再次提问,如果用户写入地址不正确,如何重定向到路径:/,例如:/foo、/bar。谢谢
    • 您需要为您的 Web 应用程序客户端创建一个匹配除 /webservice/* 之外的所有内容的正则表达式,并确保您只有一个组,以便 URL 将被重写 /。您可以在线找到很棒的正则表达式编辑器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2020-11-14
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多