Nginx-Ingress 和 Kubernetes - 请求除 / 之外的任何路由时未找到 404

问题描述 投票:0回答:2

这是我第一次使用 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: /

也许更有经验的人可以发现发生了什么或为我指出正确的方向?

谢谢。

kubernetes nginx-ingress
2个回答
2
投票

使用您的配置并转到:

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/

希望有帮助。


0
投票

我也有同样的问题。尝试将

pathType: 
文件更改为
Prefix

© www.soinside.com 2019 - 2024. All rights reserved.