【问题标题】:GKE Ingress Won't Correctly Rewrite PathsGKE Ingress 不会正确重写路径
【发布时间】:2019-09-05 08:36:56
【问题描述】:

我最近在 GKE 中设置了一个 nginx 入口,但不知何故,入口无法正确重写目标 pod 内的迷你应用程序(laravel lumen)的路径以解决问题。这些应用程序有一个名为“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 路径/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

【问题讨论】:

  • 欢迎来到 StackOverflow!不幸的是,您没有在这个问题中提供任何相关的、可测试的代码,因此我们必须自己编写整个游戏的代码来弄清楚。因此,您的问题可能过于宽泛。如果您在提出新问题之前可以read these guidelines,那就太好了。谢谢。
  • 哦,对不起,我的错。我现在在问题中附加 yaml 文件。谢谢。
  • 您是否创建了入口控制器?您也可以在您的帖子中描述它吗?
  • 不,我没有。我以为 GKE 会自动提供入口控制器,不是吗?我在注释中定义了 nginx。

标签: node.js kubernetes google-kubernetes-engine kubernetes-ingress nginx-ingress


【解决方案1】:

如果你想做nginx.ingress.kubernetes.io/rewrite-target注解,你需要创建你自己的nginx ingress controller,它是service

或者使用helm(最好):

helm install stable/nginx-ingress

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

【讨论】:

  • 啊,谢谢伙计。那么控制器将是一个部署呢?如何告诉 ingress 使用此控制器而不是默认的 GKE 控制器。我应该为 yaml 中的 kubernetes.io/ingress.class 部分定义什么?
  • @HusnurRidhaSyafni 是的,部署将作为入口控制器执行。我已经用如何使用它的适当示例更新了我的答案。如果您需要更多详细信息,请点击此链接 - kubernetes.github.io/ingress-nginx/deploy
  • @HusnurRidhaSyafni 如果您在入口对象中使用 nginx 注释,则必须设置 kubernetes.io/ingress.class: nginx
  • 非常感谢。我会试试这个。有个不错的伴侣!
  • 谢谢你,对不起,伙计,我没有完全听从你的指示。我所做的是设置一个 nginx 部署并为此创建一个服务类型的负载均衡器,所以这个 nginx 将处理重写规则。它有效,但我认为这不是正确的方法,而 Ingress 实际上是我首先想要拥有的,所以我今天会尝试这个并让你知道。
猜你喜欢
  • 2019-05-03
  • 1970-01-01
  • 2019-05-08
  • 2020-09-16
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
相关资源
最近更新 更多