Nginx 如何基于URL id在Istio上设置哈希?

Nginx 如何基于URL id在Istio上设置哈希?,nginx,kubernetes,kubernetes-ingress,istio,istio-gateway,Nginx,Kubernetes,Kubernetes Ingress,Istio,Istio Gateway,在改进Kubernetes上的API时,我正在考虑使用分布式哈希表。My API始终使用此方案接收对URL的请求: www.myapi.com/id 阅读Istio的文档,似乎很直接也很容易得到我想要的东西。事实上,Istio处理一个名为ConsistentHashLB的负载平衡方案。在这样一个方案中,服务目的地是根据从几个可能的字段计算出的哈希值来选择的:HTTP头名称、cookie、源IP和HTTP查询参数名称 在我的例子中,我需要根据与请求相关联的id计算散列 我的问题是双重和有条件的:

在改进Kubernetes上的API时,我正在考虑使用分布式哈希表。My API始终使用此方案接收对URL的请求:

www.myapi.com/id
阅读Istio的文档,似乎很直接也很容易得到我想要的东西。事实上,Istio处理一个名为
ConsistentHashLB
的负载平衡方案。在这样一个方案中,服务目的地是根据从几个可能的字段计算出的哈希值来选择的:HTTP头名称、cookie、源IP和HTTP查询参数名称

在我的例子中,我需要根据与请求相关联的
id
计算散列

我的问题是双重和有条件的:

  • 是否可以将
    id
    作为HTTP参数名读取
  • 如果是,我应该如何在清单中指定规则?(我读过的文件在这方面不够清楚)

  • 如果是否定的,有什么想法吗?什么把戏?例如,我正在考虑将id添加为带有'Nginx'的HTTP头,但这将添加一个额外的步骤。

    正如我在评论中提到的那样,如果我理解正确,您正在寻找一个ConsistenHashLB路径,那么这一点是不可能的

    这也是一个问题


    至于http头问题,您应该能够添加以下内容:

  • istio文档中有一部分用一个示例演示了如何添加/删除标题

    当特使向目标服务转发请求或从目标服务转发响应时,可以操纵消息头。可以为特定路由目的地或所有目的地指定标头操纵规则。以下VirtualService为路由到任何reviews服务目标的请求添加一个值为true的测试头。它还删除了foo响应头,但仅从来自reviews服务的v1子集(版本)的响应中删除

  • EnvoyFilter提供了一种机制来定制由Istio Pilot生成的特使配置。使用EnvoyFilter修改某些字段的值、添加特定筛选器,甚至添加全新的侦听器、群集等

    在下面,将名为customer id的请求头和alice值添加到所有通过istio入口网关的请求中。我还对响应头的代码进行了注释

    apiVersion: networking.istio.io/v1alpha3
    kind: EnvoyFilter
    metadata:
      name: lua-filter
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          istio: ingressgateway
      configPatches:
      - applyTo: HTTP_FILTER
        match:
          context: GATEWAY
          listener:
            filterChain:
              filter:
                name: "envoy.http_connection_manager"
                subFilter:
                  name: "envoy.router"
        patch:
          operation: INSERT_BEFORE
          value:
           name: envoy.lua
           typed_config:
             "@type": "type.googleapis.com/envoy.config.filter.http.lua.v2.Lua"
             inlineCode: |
                function envoy_on_request(request_handle)
                    request_handle:headers():add("customer-id", "alice")
                end
               # function envoy_on_response(response_handle)
               #     response_handle:headers():add("customer-id", "alice")
               # end
    

    使用webassembly时应该可以:


    (但您需要做一些工作才能部署它)

    如果我理解正确,您正在寻找基于请求路径/url的哈希?您尝试过ConsistenHashLB路径吗?这是有道理的。请也检查一下这个。至于添加http头问题,您应该能够使用或特使过滤器添加它。似乎我需要的所有内容都包含在您的链接中。我会仔细阅读并进一步调查。非常感谢。非常乐意帮忙!我已经发布了一些例子作为回答。谢谢你的帮助。非常感谢。我想我已经接近了,但仍然有一些细节我不知道如何处理。实际上,给定完整的URL,我如何提取后缀id以将其作为请求头而不是“Alice”值写入?@Irleon,我不确定是否可以将URL提取为头,您可能需要在上请求。我只需在虚拟服务中添加一些自定义头,并在此基础上使用一致性哈希,就像他们所做的那样。但我假设您有多个URL,这在您的用例中可能不太有效。
    apiVersion: networking.istio.io/v1alpha3
    kind: EnvoyFilter
    metadata:
      name: lua-filter
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          istio: ingressgateway
      configPatches:
      - applyTo: HTTP_FILTER
        match:
          context: GATEWAY
          listener:
            filterChain:
              filter:
                name: "envoy.http_connection_manager"
                subFilter:
                  name: "envoy.router"
        patch:
          operation: INSERT_BEFORE
          value:
           name: envoy.lua
           typed_config:
             "@type": "type.googleapis.com/envoy.config.filter.http.lua.v2.Lua"
             inlineCode: |
                function envoy_on_request(request_handle)
                    request_handle:headers():add("customer-id", "alice")
                end
               # function envoy_on_response(response_handle)
               #     response_handle:headers():add("customer-id", "alice")
               # end