为每个服务配置不同路径重写的 Kubernetes Traefik Ingress
Configure Kubernetes Traefik Ingress with different path rewrites for each service
我正在将我们的应用程序从单个实例 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/ break;
proxy_pass pushinterface:3080;
}
location /flights/ {
rewrite /flights/(.*) / 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/(.*) / break;
}
}
我对反向代理部分的最初计划是使用 NGINX 入口控制器实现入口,但我发现我的配置只能使用 NGINX Plus 创建为入口。这就是为什么我决定尝试使用 Traefik,但我不确定是否仍然可以对每个服务的路径进行不同的重写。
我尝试了以下 Ingress 配置,但似乎不起作用:
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/
- backend:
serviceName: flights
servicePort: 80
path: /flights/(.*) /
- backend:
serviceName: api
servicePort: 80
path: /api
- backend:
serviceName: grafana
servicePort: 80
path: /grafana/(.*) /
对于解决此任务的任何帮助,我将不胜感激
在您的示例中使用 ReplacePathRegex
规则类型并不能保证传入的请求将转发到目标后端,如 Traefik Documentation.
中所述
为了将请求路由到端点,请使用 Matcher 而不是 Modifiers
规则,因为它们是为此目的而设计的。
找到关于类似问题的单独讨论 。
在尝试解决我的问题数小时未果后,我使用 Nginx ingress controller 解决了这个问题,而且效果很好!这是入口配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite /push/(.*) /index/ break;
rewrite /flights/(.*) / break;
rewrite /grafana/(.*) / 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
感谢大家的解答! :)
我正在将我们的应用程序从单个实例 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/ break;
proxy_pass pushinterface:3080;
}
location /flights/ {
rewrite /flights/(.*) / 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/(.*) / break;
}
}
我对反向代理部分的最初计划是使用 NGINX 入口控制器实现入口,但我发现我的配置只能使用 NGINX Plus 创建为入口。这就是为什么我决定尝试使用 Traefik,但我不确定是否仍然可以对每个服务的路径进行不同的重写。
我尝试了以下 Ingress 配置,但似乎不起作用:
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/
- backend:
serviceName: flights
servicePort: 80
path: /flights/(.*) /
- backend:
serviceName: api
servicePort: 80
path: /api
- backend:
serviceName: grafana
servicePort: 80
path: /grafana/(.*) /
对于解决此任务的任何帮助,我将不胜感激
在您的示例中使用 ReplacePathRegex
规则类型并不能保证传入的请求将转发到目标后端,如 Traefik Documentation.
为了将请求路由到端点,请使用 Matcher 而不是 Modifiers
规则,因为它们是为此目的而设计的。
找到关于类似问题的单独讨论
在尝试解决我的问题数小时未果后,我使用 Nginx ingress controller 解决了这个问题,而且效果很好!这是入口配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite /push/(.*) /index/ break;
rewrite /flights/(.*) / break;
rewrite /grafana/(.*) / 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
感谢大家的解答! :)