Переписать Ingress на другой Ingress - PullRequest
0 голосов
/ 06 августа 2020

У меня есть две службы, запущенные в кубернетах с URL-адресами, скажем, https://service1.abc.cloud.com и https://service2.abc.cloud.com. У меня есть маршруты, определенные в Ingress для обеих служб, например, мой путь swagger https://service1.abc.cloud.com/docs, а во входящем я определил / docs to go для моей службы на порту SSO 8082. После успешного SSO SSO перенаправляет на мою службу1 / docs route.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ template "service1.fullname" . }}
  labels:
{{ include "service1.labels" . | indent 4 }}
{{ include "chart.labels" . | indent 4 }}
  annotations:
{{ include "service1.annotations" . | indent 4 }}
spec:
  rules:
    - host: {{ template "service1.dns" . }}
      http:
        paths:
          - path: /docs
            backend:
              serviceName: {{ template "service1.fullname" . }}
              servicePort: 8082

Подобный входящий файл предназначен для service2.

До сих пор история была хороша, но появилось требование, что нам нужно иметь общий URL-адрес для всех services и параметр пути для общего URL-адреса будут иметь имя службы. Итак, у нас есть 2 входных файла для service1 и service2.

Новый URL-адрес для service1 и service2 будет: -

https://mynamespace.abc.cloud.com/service1
https://mynamespace.abc.cloud.com/service2

Я создал общий входной файл для хоста mynamespace, как показано ниже. Итак, теперь у меня есть 3 входных файла: один для mynamespace, один для service1 и один для service2. Я знаю, что это должен быть один входной файл, выполняющий все сопоставления маршрутов, но до тех пор, пока мы не откажемся от URL-адресов service1 и service2, которые нам нужны для поддержки старых URL-адресов service1 и service2. После прекращения поддержки мы будем объединять весь код в одно развертывание и входить.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ template "mynamespace.fullname" . }}
  labels:
{{ include "mynamespace.labels" . | indent 4 }}
{{ include "chart.labels" . | indent 4 }}
  annotations:
{{ include "mynamespace.ingress.annotations" . | indent 4 }}
spec:
  rules:
    - host: {{ template "iot.dns" . }}
      http:
        paths:
          - path: /mynamespace/docs
            backend:
              serviceName: {{ template "service1.fullname" . }}
              servicePort: 8082

Проблема в том, что я не могу направить / mynamespace / docs хоста mynamespace в / docs хоста service1. У меня также есть sidecar SSO, который находится на порту 8082, а мои service1 и service2 находятся на порту 8080.

Конечная цель, которую необходимо достичь: - Когда пользователь нажимает url https://mynamespace.abc.cloud.com/service1/docs, он должен внутренне открыть файл swagger service1, который является размещено в https://service1.abc.barco.cloud.com/docs. URL-адрес в браузере не должен изменяться, поэтому перенаправление должно происходить на уровне кубернетов, а URL-адрес не должен изменяться в браузере. Поскольку мне также нужно поддерживать старые URL-адреса, они также должны работать, например, https://service1.abc.cloud.com и https://service2.abc.cloud.com

Старый дизайн ниже: - enter image description here

New design below:- введите описание изображения здесь

1 Ответ

2 голосов
/ 08 августа 2020

Я ставлю здесь свое предположение:

Вы пытаетесь маршрутизировать mynamespace.abc.cloud.com/service1/docs на service1:8082/docs. У вас возникли трудности с преобразованием внешнего пути /service1/docs во внутренний путь /docs service1

Если это так, то вашему входу нужны аннотации rewrite-target и use-regex :

nginx.ingress.kubernetes.io/rewrite-target: /docs/$2
nginx.ingress.kubernetes.io/use-regex: "true"

И определение пути должно быть дополнено суффиксом (/|$)(.*):

- path: /service1/docs(/|$)(.*)
...