node.js - GKE Ingress 不会正确重写路径
问题描述
我最近在 GKE 中设置了一个 nginx 入口,但不知何故,入口无法正确重写目标 pod 内的迷你应用程序(laravel 流明)的路径来解决。这些应用程序有一个名为“testing”的功能,它将为“alpha”和“beta”打印“testing one”和“testing two”。该功能应该可以通过http://<base_url>/public/testing
.
在入口 yaml 中定义了两条路径,/alpha/*
它们/beta/*
都将指向两个服务lumen-alpha-svc
和lumen-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
解决方案
推荐阅读
- swift - Swift:无法将 Int 转换为 String,为什么会发生这种情况?
- c# - C# | 如何用字典中的TValue替换输入字符串
- node.js - Mongoose 无法获取数据,仅显示空数组
- unit-testing - 在 Dart 中抛出异常的异步函数中测试副作用
- sql - 创建将使用不同参数手动运行多次的 SSRS 报告的最佳方法是什么?
- symfony - 您没有足够的权限来打开元素或执行所需的操作
- javascript - Firebase - IN查询在where子句中不起作用,结果是空白数组
- java - 根据其他列表中的匹配对象更新列表中两个对象的属性
- python - 熊猫数据框。聚合列取决于另一列中的值
- reactjs - 单击后如何更改 React js 上的按钮材质 UI 标签的颜色?