【问题标题】:Configure Kubernetes Traefik Ingress with different path rewrites for each service为每个服务配置不同路径重写的 Kubernetes Traefik Ingress
【发布时间】:2018-08-13 12:35:13
【问题描述】:

我正在将我们的应用程序从单实例 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 的原因,但我不确定是否仍然可以对每个服务的路径进行不同的重写。

我尝试了以下 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

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

【问题讨论】:

  • 你在云端试试吗?前提?当您运行 kubectl get svc 时,您是否看到所有服务?请删除规则中的主机,然后重试。请分享更多信息
  • 我在本地配置它。所有服务都可以通过 kubectl get svc 获得。有趣的是,配置列表中的第一个服务总是被正确路由,但对于其他必须重写路径的服务,我得到 404。当我访问example.com 时,我也得到了第一个提到的服务。我也试过在规则中没有主机,结果是一样的。

标签: nginx kubernetes traefik kubernetes-ingress traefik-ingress


【解决方案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

感谢大家的回答! :)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 非常感谢。您能否提供一些 Ingress 的代码示例,因为我找不到在 Ingresses 中使用 Matchers 的合适示例?
    • 查看link 并参考基于路径的路由示例。
    • 感谢您提供的链接,但此示例非常基础,并未涵盖我的用例。我的意思是,不是入口中服务的每条路径都应该改变。我提供的入口只是一个例子,我有更多的服务。我可以轻松更改他们的大部分路径以满足基本的入口配置,但有些服务是第三方的,我无法更改他们的路径。这就是为什么我一直在寻找更高级的 Ingress 配置
    • 让您自己熟悉 Matchers 规则用法Guidelines,以便找到适合您相关案例的最佳解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多