TLDR - 在K8群集上托管1个React应用程序 . 托管两个不是因为两者都需要到 '/static' 的路径 . 无法使Ingress服务与Create React App构建限制很好地协作 .

Setup...

  • 创建React App v2

  • 头盔

  • 使用NGNIX GKE Kubernetes

Detail

未弹出时,Create React App构建过程输出 build 文件夹,其中包含存储在 build/static 子文件夹中的静态css和js块 .

Default Create React App Folder Structure

虽然您可以更改 build 文件夹的名称,但无法在不弹出的情况下更改 static 文件夹的名称 .

当我将应用程序部署到GKE上的K8群集并提供Ingress服务路径时,我的应用程序和静态文件夹一切都按预期完成 .

这个Ingress服务工作....

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
    kubernetes.io/ingress.class: nginx
  creationTimestamp: 2018-04-24T11:34:49Z
  generation: 7
  labels:
    app: redacted
    chart: redacted
    heritage: Tiller
    release: redacted
  name: redacted
  namespace: frontend
  resourceVersion: redacted
  selfLink: /apis/extensions/v1beta1/namespaces/frontend/ingresses/redacted
  uid: redacted
spec:
  rules:
  - host: redacted
    http:
      paths:
      - backend:
          serviceName: redacted
          servicePort: 80
        path: /crm
  - host: redacted
    http:
      paths:
      - backend:
          serviceName: redacted
          servicePort: 80
        path: /static
  tls:
  - hosts:
    - redacted
    secretName: redacted
status:
  loadBalancer:
    ingress:
    - ip: redacted

问题是当我在同一个集群上托管第二个React App时 . 由于两个应用程序都需要一条路径,因此NGINX要求最旧的规则得到尊重,因此只有一个应用程序能够加载所需的文件 .

所以...这里有两个问题

  • 为什么我需要首先明确提供 /static 路径 . 为什么Ingress服务无法使用 /crm 处的文件和子文件夹可访问该路径?

  • 如何代理/重写/执行任何操作以使 app2/static 中的文件通过Ingress服务公开?

我尝试过的事情

  • 弄清楚如何在CRA构建过程中重命名静态文件夹

  • crm/*crm/static/*app2/*app2/static/* 等的所有变体 . 通配符似乎与NGINX有很多问题

  • CRA homepage package.json参数 .

  • 该服务上的应用程序都没有 /static . (两者都不起作用) .

我很难过 . 任何一个应用程序在独立托管时工作正常当我达到谷歌能力的极限时,任何帮助都会受到高度赞赏 .