GKE 使用静态 ip 和扇出安装 nginx ingress
GKE install nginx ingress with static ip and fanout
我正在努力使用 运行 GKE 中带有简单扇出的 nginx 入口控制器。我在三个不同的路径后面有三个服务。这是路径 /api/something
和 /api/somethingelse
上的两个微服务,以及一个在 /
上提供服务的前端。 API 工作正常,前端在控制台中出现 Uncaught SyntaxError: Unexpected token '<'
失败。它无法正确加载 html/javascript/css。
我使用以下命令安装 nging-ingress 控制器
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: /
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 }}
服务的名称和端口都正确,只有"partially"服务前端服务失败。
编辑:
我发现错误是由于控制器执行 url 重写的方式造成的。当它匹配 /
时,那么 /
将与 /
相同。因此它将再次加载根应用程序并在它期望 js 或 css 的地方接收 html。因此错误。
那么问题是,我怎样才能在根上映射一些东西,如果匹配,不 url 重写?
解决方案是为需要 url-rewrite 的 api 创建一个入口,为不需要 url-rewrite 的前端创建一个入口。从上面的问题中,我用这两个替换了一个入口:
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: /
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 }}
我正在努力使用 运行 GKE 中带有简单扇出的 nginx 入口控制器。我在三个不同的路径后面有三个服务。这是路径 /api/something
和 /api/somethingelse
上的两个微服务,以及一个在 /
上提供服务的前端。 API 工作正常,前端在控制台中出现 Uncaught SyntaxError: Unexpected token '<'
失败。它无法正确加载 html/javascript/css。
我使用以下命令安装 nging-ingress 控制器
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: /
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 }}
服务的名称和端口都正确,只有"partially"服务前端服务失败。
编辑:
我发现错误是由于控制器执行 url 重写的方式造成的。当它匹配 /
时,那么 /
将与 /
相同。因此它将再次加载根应用程序并在它期望 js 或 css 的地方接收 html。因此错误。
那么问题是,我怎样才能在根上映射一些东西,如果匹配,不 url 重写?
解决方案是为需要 url-rewrite 的 api 创建一个入口,为不需要 url-rewrite 的前端创建一个入口。从上面的问题中,我用这两个替换了一个入口:
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: /
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 }}