【问题标题】:NGINX Ingress to Microk8s Bare metal cluster not working as expectedNGINX 入口到 Microk8s 裸机集群未按预期工作
【发布时间】:2021-03-06 04:27:19
【问题描述】:

先介绍一点背景:

我们目前在 Plesk 服务器上托管了多个网站和服务,我正在设置一个裸机开发服务器以提供一个区域,我们可以在投入生产之前测试更新等。我正在使用在 Ubunutu 20.04.01 上运行 microk8s 的 3 节点 kubernetes 集群。我们托管的服务非常多样化:我们有几个 Moodle 站点、几个 Wordpress 站点、一个运行 Limesurvery 的站点、一个 Mantis bugtracker 实例等等。我已经成功地将大多数站点容器化并在 k8s 上运行。我还可以通过 NodePort 或 MetalLB 负载均衡器访问每个单独的站点。

但是,我真的很想在负载均衡器上使用 NGINX 入口控制器,这样我就可以在不使用一堆 IP 地址(或者在 NodePort 的情况下,端口改变)。无论我做了什么,我似乎都无法让 Ingress 做我想做的事。我只是想做以下事情: http://<LB IP Address>/bugtracker 访问 Mantis Bug Tracker 站点 http://<LB IP Address>/moodle1 访问 Moodle 网站之一 http://<LB IP Address>/limesurvey 访问石灰调查, 等等。我似乎能够访问网站的主页(例如 index.html、index.php 等),但是从那里的任何引用都不起作用 - 即它们给出路径未找到错误或 404 错误.

这是我的 Ingress 文件的示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
      - path: /limesurvey(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: limesurvey-svc
            port:
              number: 80
      - path: /moodle(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: moodle-svc
            port:
              number: 8080

这个入口不起作用(我得到了 404)。但是,如果我在文件中只有一个路径并且只使用“/”它可以工作(但我只能将它用于一项服务):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: limesurvey-svc
            port:
              number: 80

我认为我需要的是将路径 (limesurvey) 继续预先添加到每个 URL 请求上,但我似乎无法做到这一点。我认为这是因为当我导航到 http://<LB IP Address>/limesurvey 并单击调查时,我在 http://<LB IP Address>/index.php/<survey number> 收到 404 错误。但是,如果我在浏览器中手动将 URL 更改为 http://<LB IP Address>/limesurvey/index.php/<survey number>,它将访问调查(但仍有 404 和支持资产)。

我是否试图在 Ingress 控制器的设计用途之外做一些事情?我觉得我应该能够使用 rewrite-target 来实现这一点,但我错过了一些关键的东西。

感谢您的帮助。

【问题讨论】:

  • 您使用的是哪个 Kubernetes 版本?您是否在任何级别配置了 Plesk?如果您将编写整个 url 手动操作它的工作?你能逐步提供一些用例场景吗?你是如何部署 Nginx Ingress 的?
  • @PjoterS,我根本没有在集群中使用 Plesk,我什至不应该提到它。 (对困惑感到抱歉)。我正在使用 Kubernetes 版本 1.19.3 和 NGINX Ingress 控制器版本 0.41.2。我通过以下命令部署了 ingress-nginx:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml。再举一个例子:假设我的 LoadBalancer IP 地址是 1.2.3.4。然后我想通过http://1.2.3.4/limesurvey 访问limesurvey。

标签: kubernetes kubernetes-ingress nginx-ingress microk8s


【解决方案1】:

一些应用程序在static content 上中继从不同的URL webserver 位置提供服务,此外还执行内部path routing(例如,您点击"/" 路径但立即获得"/admin" 部分的服务)。

在这种情况下,创建正确的 Ingress 规则会变得更加棘手,并且需要您更好地了解 Web 应用程序的行为和构造,以预测用户可能访问的所有可能的 URL 路径位置(这些也是由应用程序内部重定向强制执行的) ),这些也来自html 代码。

您使用limesurvey 应用程序的情况似乎属于该类别:

我为什么会这样想?
只需尝试打开 Limesurvey 公共演示 (https://demo.limesurvey.org/) 并检查网站内容。

您将了解到主页使用了大量静态文件(例如cssjavascrpt files),引用的绝对路径以:/tmp/assets/...开头

<link rel="stylesheet" type="text/css" href="/tmp/assets/2d523ae6/survey.css" />

当然,不同路径位置的变体可以与单个智能reg-ex 模式匹配,以避免创建许多单独的入口规则(您尝试过的)。

有什么问题?

rules:
  - http:
      paths:
      - path: /limesurvey(/|$)(.*) <---- it won't match "/tmp/assets/..." location
        pathType: Prefix
        backend:
          service:
            name: limesurvey-svc
            port:
              number: 80

请尝试创建额外的Ingress 规则以支持静态文件位置(注意,我使用的是 Ingress 资源的旧语法,请根据您的需要进行调整):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  name: ingress-limesurvey-static
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: limesurvey-svc
          servicePort: 80
        path: /?(.*)

最佳解决方案(我认为)

您应该直接在您的应用程序中定义自定义公共 URL。详细信息可以在Advanced path settings中找到,见publicurl选项。

这样您就不需要为静态文件定义内部引用,但是应该在安装期间完成。

【讨论】:

  • 感谢您花时间研究和回答我的问题。我将看看是否可以修改我的应用程序的安装位置以允许使用公共 URL(而不是当前的:/var/www/html)。这会有点棘手,因为我使用的 docker 图像并不总是提供更改这些设置的能力。我可能必须制作自己的图像。再次感谢您的建议。
猜你喜欢
  • 2020-10-18
  • 2021-02-02
  • 2016-06-28
  • 2023-01-20
  • 2018-05-27
  • 2021-05-16
  • 2021-07-18
  • 2020-01-12
  • 1970-01-01
相关资源
最近更新 更多