Nginx 如何基于URL id在Istio上设置哈希?
在改进Kubernetes上的API时,我正在考虑使用分布式哈希表。My API始终使用此方案接收对URL的请求: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计算散列 我的问题是双重和有条件的:
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