首页 > 解决方案 > GKE 使用静态 IP 和扇出安装 nginx 入口

问题描述

我正在努力通过简单的扇出在 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: /$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?

标签: google-kubernetes-enginekubernetes-helmnginx-ingress

解决方案


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

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 }}

推荐阅读