首页 文章

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

提问于
浏览
0

我正在将我们的应用程序从单实例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创建为Ingress . 这就是我决定尝试使用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/$1
      - backend:
          serviceName: flights
          servicePort: 80
        path: /flights/(.*) /$1
       - backend:
          serviceName: api
          servicePort: 80
        path: /api
      - backend:
          serviceName: grafana
          servicePort: 80
        path: /grafana/(.*) /$1

我将非常感谢您解决此任务的任何帮助

2 回答

  • 0

    在示例中使用 ReplacePathRegex 规则类型并不保证传入请求将转发到目标后端,如Traefik Documentation中所述 .

    为了将请求路由到 endpoints ,请使用Matcher而不是 Modifiers 规则,因为它们是为此目的而设计的 .

    找到关于类似问题here的单独讨论 .

  • 0

    经过几个小时尝试解决我的问题失败后,我用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
    

    感谢大家的答案! :)

相关问题