【问题标题】:Kubernetes ingress css and jv not found未找到 Kubernetes 入口 css 和 jv
【发布时间】:2021-10-24 13:11:11
【问题描述】:

我使用kubeadm 创建了一个 Kubernetes 集群。服务被声明为ClusterIP。目前,我正在尝试使用 Metallb 将我的应用程序部署为 loadbalancer 类型的入口,但我遇到了一些问题。如果我将我的应用程序部署为入口,则找不到一些 jv 和 css 组件。将应用程序作为服务运行没有问题,但在我使用 Ingress 时出现了问题。它是一个 ASP.NET Core 应用程序

我的 Ingress 来源:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: taco-ingress
spec:
  rules:
   - host: tasty.taco.com
     http:
       paths:
       - path: /web1
         pathType: Prefix
         backend:
           service:
             name: web1
             port:
               number: 80
       - path: /web2
         pathType: Prefix
         backend:
           service:
             name: web2
             port:
               number: 80

我的部署来源:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web1
  labels:
    app: taco
    taco: web1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: taco
      task: web1
  template:
    metadata:
      labels:
        app: taco
        task: web1
        version: v0.0.1
    spec:
      containers:
      - name: taco
        image: yatesu0x00/webapplication1:ingress-v1
        ports:
        - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web2
  labels:
    app: taco
    taco: web2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: taco
      task: web2
  template:
    metadata:
      labels:
        app: taco
        task: web2
        version: v0.0.1
    spec:
      containers:
      - name: taco
        image: yatesu0x00/webapplication2:ingress-v1
        ports:
        - containerPort: 80

我的服务来源:

---
apiVersion: v1
kind: Service
metadata:
  name: web1
spec:
  ports:
  - targetPort: 80
    port: 80
  selector:
    app: taco
    task: web1
---
apiVersion: v1
kind: Service
metadata:
  name: web2
spec:
  ports:
  - targetPort: 80
    port: 80
  selector:
    app: taco
    task: web2

应用的html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Epic Website - (⌐■_■)</title>
    <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" />
    <link rel="stylesheet" href="/css/site.css" />
</head>
<body>
    <header>     
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" href="/">Home</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="navbar-brand" href="/Home2">Home2</a>
                        </li>
                        <li class="nav-item">
                            <a class="navbar-brand" href="/Home/ItWorks">Click me!</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
                <h2>Want this taco?</h2>
    <pre>
    {\__/}
    ( ●.●)
    ( >????
    </pre>
     
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2020 - <a href="/Home/Privacy">Privacy</a>
        </div>   
    </footer>
    <script src="/lib/jquery/dist/jquery.min.js"></script>
    <script src="/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/darkmode-js@1.5.7/lib/darkmode-js.min.js"></script>
    <script src="/js/site.js?v=8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U"></script>
    
</body>
</html>

如果我在浏览器中打开控制台,我可以看到&lt;script&gt; 类型的所有元素上都有404 not found

【问题讨论】:

  • 能否请您通过编辑和添加以下信息来创建your issue reproducible 您的问题:yaml 您的服务和部署的定义文件,有关您如何设置 Kubernetes 集群的信息 - kubeadmminikube 或其他解决方案?
  • 你好 Mikolaj 我编辑了我的帖子并添加了缺失的信息

标签: html kubernetes kubernetes-ingress kubernetes-service metallb


【解决方案1】:

如果您仔细查看日志,您会发现问题的原因是您的应用在路径 tasty.taco.com/css/site.css 中请求静态内容(例如 css/site.css 文件),而 Ingress Controller 没有前缀/css的定义在它的定义中返回404错误代码。

静态内容在以下路径 tasty.taco.com/web1/css/site.css 中可用 - 看看我使用了 web1 前缀,因此 Ingress 知道将这个请求重定向到哪个服务。

通常,在请求静态内容的应用中使用注解nginx.ingress.kubernetes.io/rewrite-target 经常会导致这样的问题。

解决此问题使用此注释并为您的应用添加设置基本 URL 的可能性,在您的示例中使用 UsePathBaseMiddleware class

表示一个中间件,它从请求路径中提取指定的路径基并将其附加到请求路径基中。

有关详细步骤,我建议按照this answer 中提供的步骤进行操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多