【问题标题】:Configuring k8s nginx ingress to route React SPA and backend apis配置 k8s nginx 入口以路由 React SPA 和后端 api
【发布时间】:2021-03-09 15:26:32
【问题描述】:

我的后端服务与 ingress nginx 配合得很好。 我正在尝试将前端 SPA 反应应用程序添加到我的入口,但没有成功。

我确实设法让它工作,但我无法让我的后端和前端都工作。

我的入口 yml 是

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: 'true'
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    #nginx.ingress.kubernetes.io/add-base-url: "true"
    
spec:
  rules:
    - host: accounting.easydeal.dev
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: frontend-srv
                port:
                  number: 3000
    - host: api.easydeal.dev
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: docker-hello-world-svc
                port:
                  number: 8088
          - path: /accounting(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: accounting-srv
                port:
                  number: 80
          - path: /company(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: dealers-srv
                port:
                    number: 80
                  

使用上面的这个 yml,我可以像这样戳我的后端 -> api.easydeal.dev/helloword 或 api.easydeal.dev/company/* 和它的工作原理!。

但是,我的 react 应用程序 (accounting.easydeal.dev) 以白页结束,控制台日志显示此错误 ->

Uncaught SyntaxError: Unexpected token '<'

我能让我的 react 应用工作的唯一方法是将 rewrite-target: /$2 更改为 / 。但是这样做会阻止正确路由我的其他 api。

我确实将 React 应用的主页设置为“。”但仍然有错误,我也尝试为我的前端设置路径到 /?(*)

这是我的 dockerfile

# pull the base image
FROM node:alpine

# set the working direction
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install app dependencies
COPY package.json ./
COPY package-lock.json ./
RUN npm install
COPY . ./

EXPOSE 3000
CMD ["npm", "start"]

【问题讨论】:

  • 您能否使用 Firefox“检查”窗口中的“查看源代码”或“检查器”选项卡检查实际返回的 HTML。
  • 您是否尝试在 2 个资源上拆分 Ingressaccounting 带有特定的注释,api 就像问题中的那个?
  • @SameerNaik 我没有页面,没有内容
  • @DawidKruk 当您说 2 个资源时,您的意思是创建 2 个入口服务吗?如果是这样,如果我需要它们都在同一个域上,这会带来问题吗?我认为这将为每个人创建不同的 ip
  • @Pilouk 是正确的。请看看我想说什么:kubernetes.github.io/ingress-nginx/user-guide/basic-usage

标签: reactjs docker nginx kubernetes nginx-ingress


【解决方案1】:

正如原始海报所指出的那样:

Doing 2 ingress services 出售了这个问题。

此问题的解决方案是创建 2 个单独的 Ingress 资源。

根本问题是工作负载需要 2 个不同的 nginx.ingress.kubernetes.io/rewrite-target: 参数。

以上注释可以按Ingress 资源而不是按路径设置。

您可以创建 2 个 Ingress 资源,它们将是独立的实体(将具有不同的注释),它们将“一起”工作。

更多参考可以在下面的链接中找到:


具体到nginx-ingress:

默认情况下,当您配置/部署 NGINX Ingress controller 时,您是在告诉您的 Kubernetes 集群创建 Service 类型为 LoadBalancer。此Service 将向云提供商请求 IP 地址(GKEEKSAKS),并将来自该 IP 的流量路由到您的 Ingress 控制器,在那里将评估请求并根据其进一步发送到您的 Ingress 资源定义。

附注!

By default 没有被无缘无故地使用,因为还有其他方法可以将您的Ingress 控制器暴露给外部流量。您可以通过以下链接了解更多信息:

您的Ingress 控制器将有单个 IP 地址来公开您的工作负载:

  • $ kubectl get service -n ingress-nginx ingress-nginx-controller
NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.32.6.63     AA.BB.CC.DD   80:30828/TCP,443:30664/TCP   19m

使用kubernetes.io/ingress.class: "nginx"Ingress 资源将使用该地址。

Ingress 以这种方式创建的资源在发布时将如下所示:

  • $ kubectl get ingress
NAME              HOSTS                 ADDRESS        PORTS   AGE
goodbye-ingress   goodbye.domain.name   AA.BB.CC.DD    80      19m
hello-ingress     hello.domain.name     AA.BB.CC.DD    80      19m

第二个旁注!

如果您使用的是托管 Kubernetes 集群,请参阅其文档以获取有关使用 Ingress 资源的更多参考,因为可能存在重大差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-05
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2020-07-22
    • 2016-01-29
    • 2020-11-07
    相关资源
    最近更新 更多