GKE使用静态IP和扇出安装nginx入口



我正在努力在 GKE 中运行带有简单扇出的 nginx 入口控制器。我在三条不同的路径后面有三种服务。这是路径/api/something/api/somethingelse上的两个微服务,以及一个在/处服务的前端。API 工作正常,前端失败,控制台中Uncaught SyntaxError: Unexpected token '<'。它无法正确加载html/javascript/css。

我使用以下命令安装入口控制器

helm install nginx-ingress stable/nginx-ingress 
--set rbac.create=true 
--set controller.publishService.enabled=true 
--set controller.service.type=LoadBalancer 
--set controller.service.loadBalancerIP=<static ip> 

完成此操作后,我在入口中使用此控制器:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: {{ printf "%s-ingress" (include "chart.fullname" .) }}
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2
labels:
{{- include "chart.labels" . | nindent 4 }}
spec:
rules:
- host: app.example.com # dns to the ip used when creating nginx ingress controller
http:
paths:
- path: "/"
backend:
serviceName: {{ include "frontend.fullname" . }}
servicePort: {{ .Values.frontend.service.port }}
- path: "/api/something(/|$)(.*)"
backend:
serviceName: {{ include "something.fullname" . }}
servicePort: {{ .Values.something.service.port }}
- path: /api/somethingelse(/|$)(.*)"
backend:
serviceName: {{ include "somethingelse.fullname" . }}
servicePort: {{ .Values.somethingelse.service.port }}

服务的名称和端口是正确的,它只是"部分"无法为前端服务提供服务。


编辑: 我已经发现错误是由于控制器重写 url 的方式造成的。当它匹配/时,/$2将与/相同。因此,它将再次加载根应用程序,并在它期望的 js 或 css 的地方接收 html。因此错误。

那么问题是,我如何在根上映射某些内容,如果匹配,则不重写 url?

解决方案是为需要 url 重写的 API 创建一个入口,为不需要 url 重写的前端创建一个入口。从上面的问题中,我用这两个入口替换了一个入口:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: {{ printf "%s-ingress" (include "chart.fullname" .) }}
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2
labels:
{{- include "chart.labels" . | nindent 4 }}
spec:
rules:
- host: app.example.com # dns to the ip used when creating nginx ingress controller
http:
paths:
- path: "/api/something(/|$)(.*)"
backend:
serviceName: {{ include "something.fullname" . }}
servicePort: {{ .Values.something.service.port }}
- path: /api/somethingelse(/|$)(.*)"
backend:
serviceName: {{ include "somethingelse.fullname" . }}
servicePort: {{ .Values.somethingelse.service.port }}
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: {{ printf "%s-frontend-ingress" (include "chart.fullname" .) }}
annotations:
kubernetes.io/ingress.class: nginx
labels:
{{- include "chart.labels" . | nindent 4 }}
spec:
rules:
- host: app.example.com # dns to the ip used when creating nginx ingress controller
http:
paths:
- path: "/"
backend:
serviceName: {{ include "frontend.fullname" . }}
servicePort: {{ .Values.frontend.service.port }}

最新更新