В любом случае, чтобы начать / stati c с префиксного URL (например, / client / stati c) с npm start? - PullRequest
1 голос
/ 21 января 2020

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

По сути, у меня есть входной контроллер для микросервиса, URL которого:

- path: /client/?(.*)
  backend:
    serviceName: client-cluster-ip-service
    servicePort: 3000

Однако, когда я перехожу к 192.168.64.4/client (это minikube ip), я ничего не вижу, потому что URL npm start, используемый для файлов stati c, равен /static. Мне нужно изменить его на /client/static.

Это возможно?

Я знаю, что homepage: "/client" не вариант, так как это только для производства. Это в CRA, поэтому я хотел бы избежать его извлечения.

РЕДАКТИРОВАТЬ:

Добавлен мой текущий ingress.yaml:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  name: ingress-service
  namespace: default
spec:
  rules:
    - http:
        paths:
          - path: /client/?(.*)
            backend:
              serviceName: client-cluster-ip-service
              servicePort: 3000
          - path: /api/?(.*)
            backend:
              serviceName: server-cluster-ip-service
              servicePort: 5000

Маршрут /api работает хорошо, потому что Django имеет встроенный способ обработки префиксных путей. Без этого он не будет правильно обслуживать файлы static, особенно для портала admin:

FORCED_SCRIPT_NAME = '/api'
STATIC_URL = '/api/static/'

ReactJS, очевидно, не в разработке . Вы можете вручную перейти к /client/static/js/bungle.js и увидеть .js там. Так что каким-то образом /client необходимо добавить префикс к пути /static/.

Я попытался изменить следующее:

nginx.ingress.kubernetes.io/rewrite-target: /$2

Это вызвало странное поведение.

  • На /client все та же проблема, но не удается найти файлы /static в любом месте (например, /client/static, /static, et c.)
  • На /api нельзя заставить его обслуживать что-либо с или без FORCE_SCRIPT_NAME. Вход в Django, но говорит, что он не может соответствовать ни одному из маршрутов, что невероятно странно.

1 Ответ

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

Используйте аннотации переписывания в вашем входном определении, я думаю, что в вашем случае это будет примерно так:

annotations:
  nginx.ingress.kubernetes.io/rewrite-target: /$2

$ 2 заменяется на захват (. *) Совпадения, затем если вы попытаетесь получить доступ к / client / stati c, то полученное переписывание будет / stati c ... теоретически это должно сработать, попробуйте! Если это не сработало, дайте мне знать, чтобы попытаться выяснить, почему

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

apiVersion: v1
kind: Ingress
metadata:
  name: proxy-ingress
  namespace: repoflow-s3-proxy-demo
annotations:
  nginx.ingress.kubernetes.io/rewrite-target: /resources.repoflow.com/resources/$2
  nginx.ingress.kubernetes.io/upstream-vhost: s3.amazonaws.com
spec:
  rules:
  - host: s3-proxy.repoflow.com
    http:
      paths:
        - path: /resources(/|$)(.*)
          backend:
            serviceName: resources-external-service
            servicePort: 80
...