1

我正在设置一个 GCP url 映射,以根据 cookie 值将请求路由到后端服务。由于 cookie 将具有多个键值,因此我正在尝试使用正则表达式匹配器。我需要根据 cookie 中的区域值将请求路由到后端。典型的 cookie 如下所示:foo=bar;region=eu;variant=beta;

defaultService: https://www.googleapis.com/compute/v1/projects/<project_id>/global/backendServices/multi-region-1
kind: compute#urlMap
name: regex-url-map
hostRules:
- hosts:
  - '*'
  pathMatcher: path-matcher-1
pathMatchers:
- defaultService: https://www.googleapis.com/compute/v1/projects/<project_id>/global/backendServices/multi-region-1
  name: path-matcher-1
  routeRules:
    - matchRules:
        - prefixMatch: /
          headerMatches:
            - headerName: Cookie
              regexMatch: (region=us)
      priority: 0
      service: https://www.googleapis.com/compute/v1/projects/<project_id>/global/backendServices/multi-region-1
    - matchRules:
        - prefixMatch: /
          headerMatches:
            - headerName: Cookie
              regexMatch: (region=eu)
      priority: 1
      service: https://www.googleapis.com/compute/v1/projects/<project_id>/global/backendServices/multi-region-2

但是,此 url-map 验证失败并出现以下错误:

$ gcloud compute url-maps validate --source regex-url-map.yaml
result:
  loadErrors:
  - HttpHeaderMatch has no predicates specified
  loadSucceeded: false
  testPassed: false

请注意,如果 cookie 值如下所示,则与 cookie 的完全匹配会通过验证并正确匹配region=usheaderMatches完全匹配部分如下所示:

          headerMatches:
            - headerName: Cookie
              exactMatch: region=us

关于我在这里做错了什么的任何指示?谢谢!

4

1 回答 1

1

您的推理方式是正确的,但您尝试使用的功能在 GCP 的外部负载平衡中不受支持;它仅适用于内部负载平衡。

查看文档中的最后一句话:

请注意,regexMatch 仅适用于将 loadBalancingScheme 设置为 INTERNAL_SELF_MANAGED 的负载均衡器。

在此处输入图像描述

我知道这不是您要寻找的答案,但您始终可以在 Google 的 IssueTracker 上提交新功能请求,并详细解释您想要什么、它如何工作等。

您始终可以尝试region在 http 请求中传递该值,而不是https://myhost.com一直请求是否可以添加后缀,例如:https://myhost.com/region1它将允许 GCP 负载均衡器规则对其进行处理并将流量定向到您希望的后端。

看看这个例子,在 GCP 中你能做什么和不能做什么。另一个例子在这里。还有一个(我的)解释如何使用pathMatcher将流量引导到不同的后端服务

于 2021-07-16T07:11:52.587 回答