Kubernetes 入口规则 404 资源错误的替代解决方案

Kubernetes 入口规则 404 资源错误的替代解决方案

两天来,我被以下场景困扰:我们有一个 Kubernetes 集群(Rancher GUI),在命名空间中我将托管几个不同的服务。我想设置一个入口控制器来根据传入路径路由流量。当尝试一个简单的 POC 设置时,使用以下入口,index.html 会加载,但不会加载任何资源。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    field.cattle.io/publicEndpoints: >-
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: 'true'
spec:
  ingressClassName: nginx
  rules:
    - host: domain.com
      http:
        paths:
          - backend:
              service:
                name: poc-web
                port:
                  number: 9080
            path: /test(/|$)(.*)
            pathType: Prefix

但是,这将导致 404,因为 index.html 路径如下:

<link rel="stylesheet" href="style.css">

尽管一些在线资源声称相对路径应该可以很好地与此入口配合使用,但事实并非如此,因为由于重写,请求将转到 domain.com/style.css,而不是 domain.com/test/style.css。

我能让它为我工作的唯一方法是将最终路径添加到索引 href 的前缀:

<link rel="stylesheet" href="test/style.css">

虽然它很有效,但这也意味着它无法在本地进行这样的测试,因为这条路径不存在。

有没有更好的方法来处理这个问题?我假设一种方法是在重写中使用更复杂的正则表达式,但哎呀。我觉得有一个更优雅的解决方案,一个可以在本地和通过入口工作的解决方案——但我说不上来。


请注意,index.html 通过一个非常简单的 nginx 提供服务,其配置如下:

worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid /tmp/nginx.pid;


events {
    worker_connections  1024;
}


http {
    client_body_temp_path /tmp/client_temp;
    proxy_temp_path       /tmp/proxy_temp_path;
    fastcgi_temp_path     /tmp/fastcgi_temp;
    uwsgi_temp_path       /tmp/uwsgi_temp;
    scgi_temp_path        /tmp/scgi_temp;
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;
    server {
        listen 9080;
        root /usr/share/nginx/html;
        index index.html;
        server_name    localhost;
    }

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

相关内容