为每个服务配置不同的路径重写 Kubernetes Traefik Ingress



我正在将我们的应用程序从单实例Docker-compose配置迁移到Kubernetes。我目前有以下示例 NGINX 配置,作为我的应用程序的反向代理运行:

server {
server_name             example.com;
ssl_certificate         /etc/nginx/certs/${CERT_NAME};
ssl_certificate_key     /etc/nginx/certs/${KEY_NAME};
listen                  443 ssl;
keepalive_timeout       70;
access_log              /var/log/nginx/access.log mtail;
ssl_protocols           xxxxxx
ssl_ciphers             xxxxxx
ssl_session_cache       shared:SSL:10m;
ssl_session_timeout     10m;
rewrite_log             on;
resolver                127.0.0.11 ipv6=off;
location /push/ {
auth_basic                    "Restricted";
auth_basic_user_file          /etc/nginx/htpasswd;
rewrite /push/(.*)        /index.php/$1 break;
proxy_pass                    pushinterface:3080;
}
location /flights/ {
rewrite /flights/(.*)         /$1 break;
proxy_pass                    flightstats:3090;
}
location /api/ {
proxy_pass                    $api;
}
location /grafana/ {
access_log                    off;
log_not_found                 off;
proxy_pass                    http://grafana:3000;
rewrite ^/grafana/(.*)        /$1 break;
}

}

我对反向代理部分的最初计划是使用 NGINX 入口控制器实现入口,但我看到我的配置只能使用 NGINX Plus 创建为入口。这就是我决定尝试使用 Traefik 的原因,但我不确定是否仍然可以为每个服务进行不同的路径重写。

我尝试了以下入口配置,但似乎不起作用:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example-traefik 
annotations:
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: ReplacePathRegex
spec:
rules:
- host: example.com
http:
paths:
- backend:
serviceName: pushinterface
servicePort: 80
path: /push/(.*) /index/$1
- backend:
serviceName: flights
servicePort: 80
path: /flights/(.*) /$1
- backend:
serviceName: api
servicePort: 80
path: /api
- backend:
serviceName: grafana
servicePort: 80
path: /grafana/(.*) /$1

我将不胜感激解决此任务的任何帮助

经过几个小时的尝试来解决我的问题失败后,我用 Nginx 入口控制器做到了,效果很好!下面是入口配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite /push/(.*) /index/$1 break;
rewrite /flights/(.*) /$1 break;
rewrite /grafana/(.*) /$1 break;
spec:
rules:
- host: example.com
http:
paths:
- backend:
serviceName: pushinterface
servicePort: 80
path: /push
- backend:
serviceName: flights
servicePort: 80
path: /flights
- backend:
serviceName: api
servicePort: 80
path: /api
- backend:
serviceName: grafana
servicePort: 80
path: /grafana

感谢大家的回答! :)

在您的示例中使用ReplacePathRegex规则类型并不能保证传入的请求将被转发到目标后端,如 Traefik 文档中所述。

若要将请求路由到终结点,请使用 Matcher 而不是Modifiers规则,因为它们是为此目的而设计的。

在此处查找有关类似问题的单独讨论。

相关内容

  • 没有找到相关文章

最新更新