这是我第一次使用 Docker、Kubernetes、Ingress 和 Skaffold。我正在学习在线课程,但我陷入困境。
当我仅调用主路径时
/
它会返回响应,但我尝试的任何其他路径都会返回 404。
我采取的第一步是在 /etc/hosts/ 中添加自定义本地开发 url,因此在该文件中我添加了
127.0.0.1 ticketing.com
。
然后我就有了我的入口文件。我将
host
设置为匹配 Ticketing.com,并且该路径使用正则表达式来匹配 /api/users
之后的任何路径
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: ticketing.com
http:
paths:
- path: /api/users/?(.*)
pathType: Prefix
backend:
service:
name: auth-srv
port:
number: 3000
此文件包含用于身份验证服务的部署和服务 yaml。在第二部分中,看起来
metadata: name
正确匹配 auth-srv
并且 port 3000
正确匹配。
apiVersion: apps/v1
kind: Deployment
metadata:
name: auth-depl
spec:
replicas: 1
selector:
matchLabels:
app: auth
template:
metadata:
labels:
app: auth
spec:
containers:
- name: auth
image: lmsankey/auth
---
apiVersion: v1
kind: Service
metadata:
name: auth-srv
spec:
selector:
app: auth
ports:
- name: auth
protocol: TCP
port: 3000
targetPort: 3000
如果这有帮助,这里是带有路线的index.ts。
import express from "express";
import { json } from "body-parser";
const app = express();
app.use(json());
app.get("/api/users/currentuser", (req, res) => {
res.send("Hi there!");
});
app.listen(3000, () => {
console.log("Listening on port 3000!!!!!!!!");
});
我尝试遵循这个答案https://stackoverflow.com/a/52029100/3692615但老实说我不确定我完全理解,或者这是否是我需要的。
基本上它表示将这一行添加到注释中。
nginx.ingress.kubernetes.io/rewrite-target: /
也许更有经验的人可以发现发生了什么或为我指出正确的方向?
谢谢。
使用您的配置并转到:
http://ticketing.com/api/users/currentuser
我收到了消息(嗨,那里!),它似乎很好并且正确。
无论如何,我会问你:“如果你想在你的 Express 应用程序上添加另一条路线怎么办?”
例如,如果您在 index.ts 上添加此行会怎样?
app.get('/health', (req, res) => {
res.send("Hi, i'm fine!");
});
app.get('/super-secret-section', (req, res) => {
res.send("shh! this is a supersecret section");
});
使用当前的 ingress yaml 文件,在 .ts 文件中添加这些行意味着,如果您想通过 ingress 访问它们,则需要修改 ingress.yaml 文件以映射这两个新资源:对您的目标没有好处,并且使文件过于复杂(如果我理解你的需要)
相反,您应该考虑使用带有前缀的 ingress (因为您想使用 pathType: Prefix),然后使用它为您的应用程序添加前缀(实际上是 svc)。
类似这样的:
yourdomain.com/STARTINGPOINTPREFIX/any_path_on_your_app_you_want_add
要成功实现此目标,您可以在注释中使用路径和分组的组合。
这里是一个简单的基本示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2 # this line use the group
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- http:
paths:
- pathType: Prefix
path: /cool-app(/|$)(.*) # this intercept all the paths of your app using the 'cool-app' prefix
backend:
service:
name: auth-srv
port:
number: 3000
host: ticketing.com
当您应用此 ingress yaml 时,您可以通过以下方式访问您的应用程序:
http://ticketing.com/cool-app/api/users/currentuser
另外,如果您在上面提到的 .ts 上添加两行:
http://ticketing.com/cool-app/health
http://ticketing.com/cool-app/super-secret-section
通过这种方式,您可以将应用程序的路径与入口路由分开。
从我的角度来看,获得入口的关键点是您应该使用它来创建,我将其称为您的服务的“入口点切片”。
有关 nginx 注释和重写的更多详细信息 https://kubernetes.github.io/ingress-nginx/examples/rewrite/
希望有帮助。
我也有同样的问题。尝试将
pathType:
文件更改为 Prefix