【问题标题】:Navigation on website with Kubernetes Ingress使用 Kubernetes Ingress 在网站上导航
【发布时间】:2022-01-10 12:11:01
【问题描述】:

我正在尝试在我的 Kubernetes 集群中公开一个网站。因此,我创建了一个链接到我的服务和我的 Pod 的入口。到目前为止,一切正常。 但是现在当我开始在我的页面上导航时,URL 会发生变化,但显示的站点仍然是“主页”。 如何在页面上导航并正确访问所有子页面?

我的部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wichteln-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wichteln
  template:
    metadata:
      labels:
        app: wichteln
    spec:
      containers:
      - image: jonasgoetz01/website:V1.0
        name: wichteln-container
        command: ["/bin/sh"]
        args:
          - -c
          - >-
              apt update

我的服务:

apiVersion: v1
kind: Service
metadata:
  name: wichteln-service
spec:
  selector:
    app: wichteln
  ports:
    - protocol: TCP
      port: 5000
      targetPort: 5000

我的入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wichteln-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: public
  rules:
    - http:
        paths:
          - path: /wichteln/*
            pathType: Prefix
            backend:
              service:
                name: wichteln-service
                port:
                  number: 5000

该网页是一个 NodeJS express 网页。 这是我的 routes.js 文件供参考(如果您需要更多文件,请告诉我):

const express = require('express');
const router = express.Router();
const controller = require('../controllers/controller');

// Routes
router.get('/', controller.home);

router.get('/usermanagement/', controller.viewuser);
router.post('/usermanagement/', controller.finduser);
router.get('/usermanagement/adduser', controller.formuser);
router.post('/usermanagement/adduser', controller.createuser);
router.get('/usermanagement/edituser/:id', controller.edituser);
router.post('/usermanagement/edituser/:id', controller.updateuser);
router.get('/usermanagement/viewuser/:id', controller.viewalluser);
router.get('/usermanagement/:id',controller.deleteuser);
  
module.exports = router;

每次我尝试访问该页面时,我都会从主页开始。当我点击一些通常会将我重定向到子页面的按钮时,即使 URL 正确更改,我也会留在主页上。 比如首页网址是:www.mydomain.com/wichteln → 可以看到首页。 www.mydomain.com/wichteln/usermanagement → 我还能看到首页,但想看到子页面“用户管理”。

感谢您的帮助。

【问题讨论】:

  • 这很奇怪,当你进入公共类时你使用任何入口控制器吗?还请检查入口控制器 pod 的日志,以便了解传递的内容和响应

标签: express kubernetes kubernetes-ingress


【解决方案1】:

问题很可能来自您在入口清单中的重写。

    nginx.ingress.kubernetes.io/rewrite-target: /

这意味着当入口收到来自客户端的请求时,它会获取 url 的 path 部分并将其重写为 /,然后将其传递给您的后端,这反过来又会导致后端返回您网站的根页面。

【讨论】:

    【解决方案2】:

    你应该删除 rewrite 注释并使用这个: nginx.ingress.kubernetes.io/use-regex: "true"

    在你的路径配置中你可以尝试这样的事情:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: wichteln-ingress
      annotations:
        nginx.ingress.kubernetes.io/use-regex: "true"
    spec:
      ingressClassName: public
      rules:
        - http:
            paths:
              - path: /wichteln/.*
                pathType: Prefix
                backend:
                  service:
                    name: wichteln-service
                    port:
                      number: 5000
    

    此配置创建以下 NGINX 位置块:

    location ~* "^/wichteln/.*" {
      ...
    }
    

    【讨论】:

      【解决方案3】:

      路径重写 + 捕获组

      您可以使用捕获组来捕获路径前缀之后的部分,并在重写规则see the docs中使用。

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: wichteln-ingress
        annotations:
            nginx.ingress.kubernetes.io/rewrite-target: /$2
      spec:
        ingressClassName: public
        rules:
          - http:
              paths:
                - path: /wichteln/(/|$)(.*)
                  pathType: Prefix
                  backend:
                    service:
                      name: wichteln-service
                      port:
                        number: 5000
      

      上下文路径

      另外一种常见的做法是将上下文路径注入到您的应用程序中。那么你就不需要对入口清单进行任何路径重写了。

      ...
      const ctx = process.env.CONTEXT_PATH || ''
      router.get(`${ctx}/`, controller.home);
      router.get(`${ctx}/usermanagement/`, controller.viewuser);
      ...
      
      

      要注入它,请将其添加到 pod 规范中。

      ...
      spec:
        containers:
          - image: jonasgoetz01/website:V1.0
            env:
              - name: CONTEXT_PATH
                value: /wichteln
      ...
      

      【讨论】:

        猜你喜欢
        • 2021-07-21
        • 1970-01-01
        • 1970-01-01
        • 2015-03-06
        • 2016-01-19
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        相关资源
        最近更新 更多