Как настроить вход k8s для приложения React + Express на одном домене?

У меня есть внешнее приложение, созданное с помощью React и бэкэнда на nodejs. У обоих есть отдельный образ Docker и, следовательно, отдельное развертывание на k8s (gce).

У каждого развертывания есть соответствующая служба k8s, скажем, fe-serice и be-service.

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

  • /api/* - направляются на be-service
  • все остальное направляется на fe-service

Вот мой файл yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my-host
    http:
      paths:
      - path: /*
        backend:
          serviceName: fe-service
          servicePort: 80
      - path: /api/*
        backend:
          serviceName: be-service
          servicePort: 5000

Вот что я получаю с помощью curl:

curl [ip] --header "Host: my-host" -> Приложение React (как и ожидалось)

curl [ip]/foo --header "Host: my-host" -> nginx 404 (почему?)

curl [ip]/api --header "Host: my-host" -> nginx 404 (почему?)

curl [ip]/api/ --header "Host: my-host" -> приложение nodejs

curl [ip]/api/foo --header "Host: my-host" -> приложение nodejs

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

Что мне не хватает? Это вообще возможно? Заранее спасибо!


person Andrey    schedule 06.03.2018    source источник
comment
Как сказал @doe1331, путь /api/* охватывает вызовы к /api/, но не к /api Дважды проверьте, что /foo существует в fe-service, это может быть причиной 404.   -  person Shibboleet    schedule 08.03.2018
comment
@Андрей ты нашел решение?   -  person stacksonstacks    schedule 24.08.2018
comment
@ Андрей: У меня сейчас похожая проблема с входом GKE, вы решили проблему?   -  person Santhosha    schedule 17.07.2020
comment
@ Сантоша, в тот момент нет, не знал. Но это было уже давно :) Прямо сейчас я использую Traefik на частном кластере, чтобы делать подобные вещи, и он отлично работает.   -  person Andrey    schedule 18.07.2020
comment
@Andrey: Спасибо за обновление, я работаю над аналогичной темой, используя ingress-nginx / ingress-gce .. На всякий случай, если вы когда-либо использовали контроллер nginx-ingress в кластере google kubernetes? если да, я хотел бы знать, нужно ли вам его устанавливать / как включить его на кластерах   -  person Santhosha    schedule 18.07.2020


Ответы (3)


Я не могу объяснить, почему /foo не работает

Но

/api/* не распространяется на /api, он распространяется только на все после /api/

person doe1331    schedule 07.03.2018

Я не думаю, что проблема здесь в вашем входе, а скорее в вашей настройке nginx (не видя ее!). Поскольку приложения React являются одностраничными приложениями, вам нужно указать серверу nginx всегда искать index.html вместо перехода, например. /usr/share/nginx/html/foo где, наверное, нечего найти.

Я думаю, вы найдете соответствующую информацию, например. здесь. Я желаю вам удачи @Andrey, и дайте мне знать, было ли это вообще полезно!

person Joel    schedule 07.06.2018

Надеюсь не опоздал с ответом. Используйте аннотации kubernetes use-regrex, чтобы убедиться, что что он сопоставляется с конечными точками ваших служб. Убедитесь, что в конце сброса выполнено сопоставление службы приложения React. Используйте следующий yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
  - host: my-host
    http:
      paths:
      - path: /api/?(.*)
        backend:
          serviceName: be-service
          servicePort: 5000
       - path: /?(.*)
        backend:
          serviceName: fe-service
          servicePort: 80

person Omambia Dauglous    schedule 25.02.2021