我在 EKS 集群中安装了 API 网关,并且有以下通信流程:
用户 -> F5 LB -> Nginx 入口控制器 LB (devapi.example.com) -> 服务 -> API 网关 Pods
现在,我使用 DNS 名称 devapi.example.com 和应用程序路径直接通过入口控制器负载均衡器访问 API。我的入口模板与主机名(对于所有 API 来说是唯一且共享的)相匹配,并将 URL 中附加的路径转发到应用程序 pod,这样它就可以到达正确的 API:
https://devapi.example.com/hello-world -> https://api-gateway-service/hello-world
我需要什么
我想开始在 F5 中为每个应用程序发布不同的 DNS 名称。我可以在 F5 中发布 DNS 名称并将它们指向 devapi.example.com(真的不知道是否可以在此处附加路径)。我想在 F5 中发布应用程序 DNS,这样我就可以为每个应用程序指定一个 DNS 名称,该名称将重定向到 devapi.example.com,并附加基于原始 DNS 的特定路径:
hello-world-dev.example.com -> devapi.example.com/hello-world
liveness-check-dev.example.com -> devapi.example.com/health
某些主机名可能与路径中的任何单词都不匹配(请参阅 liveness-check-dev 主机名)。有没有办法将 F5 中的原始主机名与应用程序路径映射,以便我可以重写我的路径?
您可以考虑使用这种定义 F5 配置的方法:
创建虚拟服务器,在 F5 上建立一台虚拟服务器 (vs_all_apps) 来处理所有传入流量。将
devapi.example.com
设置为默认服务器来处理与特定应用程序 DNS 规则不匹配的请求。然后启用 SNI 服务器(服务器名称指示)支持以根据主机名区分请求。
定义iRules,其中实现iRule(
rule\_rewrite\_paths)
以使用SNI信息执行基于源的路径重写。然后使用HTTP::header exists "Host"
和[HTTP::host split "." 1]
从SNI字段中提取主机名。创建一个查找表(ltm rule lookup table my\_app\_mappings)
)将 F5 主机名映射到 devapi.example.com
路径。使用 lookup
命令根据提取的主机名查找相应的路径,处理没有直接匹配的情况。使用 HTTP::uri
和映射路径( [ ltm rule lookup table my\_app\_mappings $hostname]:$uri)
。