首页 > 解决方案 > GKE Ingress 不会正确重写路径

问题描述

我最近在 GKE 中设置了一个 nginx 入口,但不知何故,入口无法正确重写目标 pod 内的迷你应用程序(laravel 流明)的路径来解决。这些应用程序有一个名为“testing”的功能,它将为“alpha”和“beta”打印“testing one”和“testing two”。该功能应该可以通过http://<base_url>/public/testing.

在入口 yaml 中定义了两条路径,/alpha/*它们/beta/*都将指向两个服务lumen-alpha-svclumen-beta-svc. 我没有此入口的任何域,因此我未定义入口中的“主机”,并且 GKE 为入口提供的外部 IP 地址仍应可以访问入口。

我通过访问http://<external-ip-address>/alpha/public/testing/两个入口路径测试了入口,我得到了 HTTP 错误 404,这件事仍然让我感到困惑。因此,我设置了一个名为的新服务,并在入口中添加了指向该服务的path-check-svc新路径。/check/*该服务然后指向将打印 url 路径的 nodejs 程序。我通过访问测试了路径,http://<external-ip-address>/check/something/nodejs 返回了 url path /check/something/。这让我更加困惑。由于入口路径被定义/check/*为将其重定向到 path-check-svc,这不会留下程序被捕获的路径/something/吗?这让我意识到这是导致 lumen 应用程序中的 http 错误 404 的原因,因为它无法解决http://<external-ip-address>/alpha/public/testing/,因为 lumen 应用程序不知道是什么/alpha/

那么我应该如何定义入口,以便可以将 url 路径重写为应用程序捕获的有效 url 路径。谢谢。

这是 Kubernetes 的 yaml 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: lumen-alpha
  labels:
    app: lumen-alpha
spec:
  selector:
    matchLabels:
      app: lumen-alpha
  template:
    metadata:
      labels:
        app: lumen-alpha
    spec:
      containers:
        - image: husnurrsyafni/lumen-test-alpha:php
          name: lumen-test-alpha                 
          ports:
            - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: lumen-beta
  labels:
    app: lumen-beta
spec:
  selector:
    matchLabels:
      app: lumen-beta
  template:
    metadata:
      labels:
        app: lumen-beta
    spec:
      containers:
        - image: husnurrsyafni/lumen-test-beta:php
          name: lumen-test-beta                 
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: lumen-alpha-svc
spec:
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: lumen-alpha
---
apiVersion: v1
kind: Service
metadata:
  name: lumen-beta-svc
spec:
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: lumen-beta
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: lumen-ingress
  annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - http:
      paths:
      - path: /alpha/*
        backend:
          serviceName: lumen-alpha-svc
          servicePort: 80
      - path: /beta/*
        backend:
          serviceName: lumen-beta-svc
          servicePort: 80

标签: node.jskubernetesgoogle-kubernetes-enginekubernetes-ingressnginx-ingress

解决方案


如果要进行nginx.ingress.kubernetes.io/rewrite-target注释,则需要创建自己的nginx 入口控制器及其服务

或者使用 helm(最好):

helm install stable/nginx-ingress

GKE 提供的 Ingress 控制器不支持rewrite-target


推荐阅读