基于环境变量的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