[英]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
將向雲提供商( GKE
、 EKS
、 AKS
)請求 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.