GKE установить nginx вход со стати c ip и разветвлением - PullRequest
1 голос
/ 27 января 2020

Я пытаюсь запустить входной контроллер 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?

1 Ответ

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

Решением было создать один вход для API, который требует перезаписи URL, и один для фронта, который не требует. Из приведенного выше вопроса я заменил один вход этими двумя:

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: "/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 }}
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: {{ printf "%s-frontend-ingress" (include "chart.fullname" .) }}
  annotations:
    kubernetes.io/ingress.class: nginx
  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 }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...