【发布时间】: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-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 路径/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