基于环境变量的Envoy路由匹配
Envoy route match based on environment variables
在使用 envoy 进行条件路由匹配时是否可以考虑环境变量?这里tag是可用的环境变量。
此处,下面的示例不起作用,但是否可以使用 tag
来执行类似下面的操作?
routes:
- match: { prefix: "/some_path/", {name: {tag}, value: "a"}}
route: { prefix_rewrite: "/", host_rewrite: {tag}.domain.com, cluster: a }
- match: { prefix: "/some_path/", {name: {tag}, value: "b"}}
route: { prefix_rewrite: "/", host_rewrite: {tag}.domain.com, cluster: b }
查看 https://www.envoyproxy.io/docs/envoy/latest/api-v2/api/v2/route/route.proto#envoy-api-msg-route-routematch,似乎只能查看路由中的字段(如前缀)而不是环境变量?或者,也欢迎任何替代建议!
谢谢!
我使用 meta-data 和 Lua filter 的组合取得了类似的效果。
将您的 tag
值和关联的集群作为 meta-data 添加到您的路由中,并使用 cluster_header 选项提供要路由到的集群名称:
routes:
- match:
prefix: "/"
metadata:
filter_metadata:
envoy.lua:
a: a
b: b
route:
cluster_header: "upstream-cluster"
然后您可以使用以下 Lua 过滤器读取环境变量 TAG
并将 header upstream-cluster
设置为匹配该值的集群。
http_filters:
- name: envoy.lua
typed_config:
"@type": type.googleapis.com/envoy.config.filter.http.lua.v2.Lua
inline_code: |
function envoy_on_request(request_handle)
local metadata = request_handle:metadata()
local cluster_name = metadata:get(os.getenv("TAG"))
if cluster_name then
request_handle:headers():replace("upstream-cluster", cluster_name)
else
request_handle:respond(
{[":status"] = "502",
["upstream"] = "envoy"},
"{\"errorCode\":502,\"reason\":\"no backend cluster found\"}")
end
end
在使用 envoy 进行条件路由匹配时是否可以考虑环境变量?这里tag是可用的环境变量。
此处,下面的示例不起作用,但是否可以使用 tag
来执行类似下面的操作?
routes:
- match: { prefix: "/some_path/", {name: {tag}, value: "a"}}
route: { prefix_rewrite: "/", host_rewrite: {tag}.domain.com, cluster: a }
- match: { prefix: "/some_path/", {name: {tag}, value: "b"}}
route: { prefix_rewrite: "/", host_rewrite: {tag}.domain.com, cluster: b }
查看 https://www.envoyproxy.io/docs/envoy/latest/api-v2/api/v2/route/route.proto#envoy-api-msg-route-routematch,似乎只能查看路由中的字段(如前缀)而不是环境变量?或者,也欢迎任何替代建议!
谢谢!
我使用 meta-data 和 Lua filter 的组合取得了类似的效果。
将您的 tag
值和关联的集群作为 meta-data 添加到您的路由中,并使用 cluster_header 选项提供要路由到的集群名称:
routes:
- match:
prefix: "/"
metadata:
filter_metadata:
envoy.lua:
a: a
b: b
route:
cluster_header: "upstream-cluster"
然后您可以使用以下 Lua 过滤器读取环境变量 TAG
并将 header upstream-cluster
设置为匹配该值的集群。
http_filters:
- name: envoy.lua
typed_config:
"@type": type.googleapis.com/envoy.config.filter.http.lua.v2.Lua
inline_code: |
function envoy_on_request(request_handle)
local metadata = request_handle:metadata()
local cluster_name = metadata:get(os.getenv("TAG"))
if cluster_name then
request_handle:headers():replace("upstream-cluster", cluster_name)
else
request_handle:respond(
{[":status"] = "502",
["upstream"] = "envoy"},
"{\"errorCode\":502,\"reason\":\"no backend cluster found\"}")
end
end