两天来,我被以下场景困扰:我们有一个 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;
}