我正在尝试将服务从 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-url
的 https://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
标头的请求更好地配置它,并在所需的处理后将其路由回正常/主入口