使用基于标头内容的入口路由流量

时间:2021-04-05 22:02:14

标签: nginx kubernetes traefik

我正在尝试将服务从 Cloud Foundry 迁移到基于 Kubernetes 的新解决方案。 为了让在我们的 Cloud Foundry 部署中寻找它的客户可以使用该服务(在消费者迁移到指向新解决方案之前需要一些时间),我想使用 Cloud Foundry route service 以便流量到来从零散的客户到基于 Kubernetes 的新部署。

Kubernetes 集群上的服务将由 Ingress 公开。

问题是 Cloud Foundry route service 会将请求路由到入口上的 / 路径,同时提供完整路径作为名为 x-cf-forwarded-url 的专用标头的一部分,该标头包含整个原始url,这意味着需要根据该标头提取和路由到该路径(这通常使用“X-Forwarded-Prefix”标头完成,但 Cloud Foundry 的做法有所不同......)

示例:
我的 Cloud Foundry 服务 MyBookingService 预订端点将响应以下 URL:https://mybookingservice-cfaccount.cfdomain.com/api/v1/book

使用 Cloud Foundry route service 时,请求将路由到我在 Kubernetes 中的入口

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: bookingservice-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/http-snippet: |
      map $http_x_cf_forwarded_url $router_path {
        ~^https://[^/]*(?<forward_path>/.*)$     $forward_path;
        default                                  "/nonexistingpath";
      }
    nginx.ingress.kubernetes.io/configuration-snippet: |
      location = "/" {
        rewrite ^/?$ https://bookingservice.myk8scluster.com$router_path break;
      }
spec:
  tls:
    - hosts:
        - >-
          bookingservice.myk8scluster.com
      secretName: bookingservice-cert
  rules:
    - host: bookingservice.myk8scluster.com
      http:
        paths:
          - backend:
              serviceName: bookingservice
              servicePort: 8080

请求命中 https://mybookingservice-cfaccount.cfdomain.com/api/v1/book 并将被路由到 bookingservice.myk8scluster.com/ 和包含原始请求 x-cf-forwarded-urlhttps://mybookingservice-cfaccount.cfdomain.com/api/v1/book 标头,包括路径(所有这些都是由路由服务)。
我正在寻找一种方法来将请求路由到入口路由到的服务,仅添加需要从 /api/v1/book 标头中提取的 x-cf-forwarded-url 路径。

我一直在查看 nginx rewrite 和更标准的 x-forwarded-prefix-header 的使用,但是我似乎找不到使用正则表达式在股票 nginx 入口上执行此操作的方法,我希望避免仅为此路径转换目的部署单独的自定义 nginx。

有什么想法吗?

编辑: 我编辑了示例以显示我取得的进展(使用 configuration-snippet 执行重写并在 http-snippet 中执行 header regex)但是我仍然无法在重写中使用 $router_path 因为入口控制器正在说这个入口定义未通过测试(因此不会被应用)

Edit2:这似乎是不可能的(在 nginx 入口服务器/配置注释中使用映射和/或变量作为重写的一部分)。 我已经恢复部署一个单独的独立 nginx,我可以为包含 x-cf-forwarded-url 标头的请求更好地配置它,并在所需的处理后将其路由回正常/主入口

0 个答案:

没有答案