Microk8s kubernetes中带有入口的MERN应用程序,页面不显示

问题描述

我有一个Mongo,Express,React Node应用程序,当前已部署在microk8s吊舱中。我正在尝试为该应用设置Ingress。快递服务器设置为如下所示与express.static进行服务

  app.use(express.static('DemoApp/build'));

  app.get('*',function(req,res,next) {
    res.sendFile(path.resolve(__dirname,'DemoApp','build','index.html'));
  });

当我导航到kubernetes集群的ip:port时,一切正常,当我导航到入口主机的FQDN时,即使一切正常,但是一旦我向入口添加路径,则该应用仅显示一个白屏。值得注意的是,我的kubernetes节点和工作站都在内部专用网络中运行。我没有试图公开任何其他内容。我已尝试按照本文(ReactJS app displays whitescreen using Kubernetes Ingress)中提供的步骤进行操作,但尚未解决该问题。我已经为microk8s启用了内置的入口控制器。

下面是我用于无效的YAML

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
Metadata:
  name: demo-ingress
  annotations:
    Nginx.ingress.kubernetes.io/rewrite-target: /$1
  namespace: default
spec:
  rules:
  - host: apps.sst.com
    http:
      paths:
      - path: /demo(/|$)(.*)
        backend:
          serviceName: mern-demo
          servicePort: 4000

这是有效的Ingress YAML

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
Metadata:
  name: demo-ingress
  annotations:
  namespace: default
spec:
  rules:
  - host: apps.sst.com
    http:
      paths:
      - path:
        backend:
          serviceName: mern-demo
          servicePort: 4000

一个要注意的是我的应用程序正在使用React Router。根据进一步的研究,我想知道这是否会影响到一切。

任何帮助将不胜感激。谢谢

解决方法

在您的YAML中使用的

rewrite-target注释

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

仅适用于Nginx Ingress 。当您使用默认的ingress时,它将不起作用。您将需要手动安装它,因为它提到了here

现在取决于您的环境是本地环境还是云环境,您需要配置MetalLB。有关更多详细信息,请检查this thread

关于Nginx Ingress上的MicroK8s问题,也存在类似的StackOverflow问题,您可以在this SO thread中进行阅读。

但是,您需要使用重写吗?您不能使用multiple pathsdefault backend吗?像这样:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  backend:
    serviceName: hello-world
    servicePort: 60000
  rules:
  - http:
      paths:
      - path: /world
        backend:
          serviceName: hello-world
          servicePort: 60000
      - path: /kube
        backend:
          serviceName: hello-kubernetes
          servicePort: 80