Проблема Входной контроллер вспомогательного пути для внутреннего сервиса - PullRequest
0 голосов
/ 17 января 2020

У меня проблема с настройкой входного контроллера пути для бэкэнда. Например, я хочу настроить:

  1. приложение внешнего интерфейса с angular (путь: /)
  2. бэкэнд-сервис с 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

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

, если я звонил по другому маршруту, результат тот же «Welcome to myApp». Но если я использовал Nodeport

curl http://<minikubeip>:30009/data/office/getOffice => 'Get Data Office', working properly.

В чем проблема? любое решение? Спасибо

1 Ответ

1 голос
/ 17 января 2020

TL; DR

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