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

时间:2020-01-27 12:27:20

标签: google-kubernetes-engine kubernetes-helm nginx-ingress

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

1 个答案:

答案 0 :(得分:1)

解决方案是为需要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 }}