Переписывание сервисов Kubernetes во входе Nginx - PullRequest
1 голос
/ 15 мая 2019

У меня есть несколько API-интерфейсов, прослушивающих '/ api', и веб-интерфейс, прослушивающих '/'.

Есть ли способ, которым я могу написать свое определение входа, чтобы переписать пути к чему-то вроде следующего?

/api/      -> /api/ on service1
/api2/api/ -> /api/ on service2
/api3/api/ -> /api/ on service3
/          -> /     on service4

Я знаю, что могу изменить API для прослушивания чего-то другого, но не хочу этого делать. Я знаю, что могу также просто переписать все в / api / и позволить сервису 3 действовать по умолчанию, но могут быть и другие сервисы, которым в будущем потребуется маршрутизация.

Я слышал, что вы можете использовать несколько входов, но я не уверен, как это повлияет на производительность и будет ли это лучше всего делать.

Кроме того, есть ли способ отладки, какой маршрут идет к какой службе?

Спасибо, Джеймс

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Если вы используете Nginx, вы сможете настроить свой Ingress для соответствия пути следующим образом:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: test.com
    http:
      paths:
      - path: (/api/.*)
        backend:
          serviceName: service1
          servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress-2
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
  - host: test.com
    http:
      paths:
      - path: /api2/.*
        backend:
          serviceName: service2
          servicePort: 80
      - path: /api3/.*
        backend:
          serviceName: service3
          servicePort: 80
      - path: /.*
        backend:
          serviceName: service4
          servicePort: 80

Дополнительная информация

1 голос
/ 15 мая 2019

С помощью @Rahman - см. Другой ответ.Мне удалось заставить это работать с одним входом.

Мне пришлось опубликовать это как дополнительный ответ из-за ограничения символов.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
  - secretName: tls-secret
  rules:
  - host: localhost
    http:
      paths:
      - path: /(api/.*)
        backend:
          serviceName: service1
          servicePort: 80
      - path: /api2/(api.*)
        backend:
          serviceName: service2
          servicePort: 80
      - path: /api3/(api.*)
        backend:
          serviceName: service3
          servicePort: 80
      - path: /(.*)
        backend:
          serviceName: service4
          servicePort: 80

Просто для контекста длякто-нибудь еще сталкивается с этим в будущем, сервис 1 - это основной API, сервис 2 и 3 - это другие API в другом поддомене, а сервис 4 - это веб-интерфейс.

...