簡體   English   中英

配置 k8s nginx 入口以路由 React SPA 和后端 api

[英]Configuring k8s nginx ingress to route React SPA and backend apis

我的后端服務與入口 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/* 並且它工作..

但是我的反應應用程序(accounting.easydeal.dev)最終得到一個白頁,控制台日志顯示此錯誤->

Uncaught SyntaxError: Unexpected token '<'

我能夠使我的反應應用程序工作的唯一方法是將 rewrite-target: /$2 更改為 / 但是,這樣做會阻止正確路由我的其他 api。

我確實將反應應用程序的主頁設置為“。” 但仍然有錯誤,我也嘗試為我的前端設置路徑到 /?(*)

這是我的 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"]

正如原始海報的評論所指出的:

做 2 個入口服務出售了這個問題。

此問題的解決方案是創建 2 個單獨的Ingress資源。

根本問題是工作負載需要 2 個不同的nginx.ingress.kubernetes.io/rewrite-target:參數。

上述注釋可以按Ingress資源而不是按路徑設置。

您可以創建 2 個Ingress資源,它們將是單獨的實體(將具有不同的注釋),它們將“一起”工作。

更多參考可以在下面的鏈接中找到:


特定於nginx-ingress

默認情況下,當您配置/部署NGINX 入口 controller時,您會告訴您的 Kubernetes 集群創建LoadBalancer類型的Service Service將向雲提供商( GKEEKSAKS )請求 IP 地址,並將來自該 IP 的流量路由到您的Ingress Z594C103F2C6E04C3D8AB059F031 E0C1 並將根據定義評估的資源發送到您的Ingress Z594C103F2C6E04C1。

旁注!

By default不會無故使用,因為還有其他方法可以將Ingress controller 暴露給外部流量。 您可以通過以下鏈接了解更多信息:

您的Ingress controller 將有一個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資源:“nginx”將使用該地址。

以這種方式創建的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資源的更多參考,因為可能存在重大差異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM