nginx - 如何根据 URL id 在 Istio 上设置哈希?
问题描述
在改进 Kubernetes 上的 API 的背景下,我正在考虑使用分布式哈希表。我的 API 始终使用此方案接收对 URL 的请求:
www.myapi.com/id
阅读 Istio 的文档,似乎很直接也很容易得到我想要的东西。实际上,Istio 处理了一种称为ConsistentHashLB
. 在这样的方案中,服务目标是根据从几个可能的字段计算的哈希值选择的:HTTP 标头名称、cookie、源 IP 和 HTTP 查询参数名称。
就我而言,我需要根据id
与请求关联的值来计算哈希值。
我的问题是双重和有条件的:
- 是否可以将其读取
id
为 HTTP 参数名称? - 如果是肯定的,我应该如何在清单中指定规则?(我读过的文档在这方面不够清楚)。
如果是否定的,有什么想法吗?一些技巧?例如,我正在考虑将 id 添加为带有 Nginx 的 HTTP 标头,但这会增加一个额外的步骤。
解决方案
正如我在评论中提到的,如果我理解正确,您正在寻找一个 ConsistenHashLB 路径,有关于它的文档。
还有关于那个的github问题。
至于 http 标头问题,您应该可以通过以下方式添加它:
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
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
推荐阅读
- javascript - 您如何访问/遍历 SVG.js 中组的子元素
- javascript - 如何在单击按钮时调用/打开 Razor 视图
- python - 在 2 个或多个列表之间交换具有相同索引的元素
- heroku - 有没有办法在heroku中设置dyno重启时间?
- c - 评估 `int x = -2147483648` 时会发生什么?
- android - MediaStore.MediaColumns#DATE_TAKEN 是否仅适用于 API 级别 29?
- mysql - 尝试通过 XAMPP 将 Laravel 连接到 Mysql
- python - 如何转换为计算 JSON?
- python - Python在相同值的出现后对列表列表进行排序
- ruby - Ruby 中“模块”方法的文档在哪里?