Я пытаюсь запустить входной контроллер nginx в GKE с простым разветвлением. У меня три службы за тремя разными путями. Это два микросервиса в трактах /api/something
и /api/somethingelse
, а внешний интерфейс обслуживается в /
. API работает нормально, интерфейс не работает с Uncaught SyntaxError: Unexpected token '<'
в консоли. Не удается правильно загрузить html / javascript / css.
Я устанавливаю входной контроллер nging со следующей командой
helm install nginx-ingress stable/nginx-ingress \
--set rbac.create=true \
--set controller.publishService.enabled=true \
--set controller.service.type=LoadBalancer \
--set controller.service.loadBalancerIP=<static ip>
Когда это сделано, я использую этот контроллер в моем входе:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: {{ printf "%s-ingress" (include "chart.fullname" .) }}
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2
labels:
{{- include "chart.labels" . | nindent 4 }}
spec:
rules:
- host: app.example.com # dns to the ip used when creating nginx ingress controller
http:
paths:
- path: "/"
backend:
serviceName: {{ include "frontend.fullname" . }}
servicePort: {{ .Values.frontend.service.port }}
- path: "/api/something(/|$)(.*)"
backend:
serviceName: {{ include "something.fullname" . }}
servicePort: {{ .Values.something.service.port }}
- path: /api/somethingelse(/|$)(.*)"
backend:
serviceName: {{ include "somethingelse.fullname" . }}
servicePort: {{ .Values.somethingelse.service.port }}
Имена и порты служб верны, и он только «частично» не обслуживает интерфейсный сервис.
РЕДАКТИРОВАТЬ: я понял, что ошибка из-за способа, которым контроллер делает переписать URL. Когда он соответствует /
, тогда /$2
будет таким же, как /
. Следовательно, оно снова загрузит приложение root и получит html там, где оно ожидает js или css. Таким образом, ошибка.
Тогда возникает вопрос, как я могу сопоставить что-то на root и, если это не совпадает, не перезаписать URL?