首页 > 解决方案 > 如何根据 URL id 在 Istio 上设置哈希?

问题描述

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

www.myapi.com/id

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

就我而言,我需要根据id与请求关联的值来计算哈希值。

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

  1. 是否可以将其读取id为 HTTP 参数名称?
  2. 如果是肯定的,我应该如何在清单中指定规则?(我读过的文档在这方面不够清楚)。

如果是否定的,有什么想法吗?一些技巧?例如,我正在考虑将 id 添加为带有 Nginx 的 HTTP 标头,但这会增加一个额外的步骤。

标签: nginxkuberneteskubernetes-ingressistioistio-gateway

解决方案


正如我在评论中提到的,如果我理解正确,您正在寻找一个 ConsistenHashLB 路径,有关于它的文档

还有关于那个的github问题


至于 http 标头问题,您应该可以通过以下方式添加它:

  1. 虚拟服务

istio 文档中有Headers部分,它通过示例展示了如何添加/删除标题。

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

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  http:
  - headers:
      request:
        set:
          test: "true"
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v2
      weight: 25
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1
      headers:
        response:
          remove:
          - foo
      weight: 75
  1. 特使过滤器

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

在 envoy 过滤器下方,向通过 istio 入口网关的所有请求添加名为 customer-id 的请求标头,并带有 alice 值。我还注释了响应标头的代码。

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

推荐阅读