kubernetes - 基于 URL 的具有亲和力的服务代理
问题描述
我正在寻找具有基于 URL 的亲和性的服务代理(或负载平衡器)。
这是在集群内部的 Kubernetes 中使用的:我正在寻找一个“内部”负载均衡器,我不需要将服务暴露在外部。
默认情况下,Kubernetes 中的服务使用“循环”算法。
我想要一些基于 HTTP URL 的一部分的亲和力:第一个请求将转到一个随机 pod,而使用相同 URL 的后续请求将(最好)转到同一个 pod。
我已经阅读了一些关于基于 sourceIP 的亲和力的文档,这是否基于 URL 存在?
我很快就读到了 Envoy,也许使用“环哈希”负载平衡算法就可以了,但我不知道是否可以基于 URL 进行哈希处理。
也许使用 kube-proxy 的“ipvs”代理模式(https://kubernetes.io/docs/concepts/services-networking/service/#proxy-mode-ipvs)可以,但我只看到“目标散列”和“源散列”作为负载平衡算法,我也不知道如何配置它。
解决方案
正如您已经提到的,IPVS代理算法定义了源 IP 地址和目标 IP 地址,以便为负载平衡生成唯一的哈希键。但是,它在拦截 TCP 或 UDP 服务的网络流量的 L4 传输层中运行。因此,与 HTTP 请求交互并根据 URL 路径做出路由决策可能会很困难。
Envoy代理通过HTTP 标头值表示一致的散列,在HTTP 路由器过滤器中与环散列负载平衡策略一起指定。因此,您可以在 Hash policy 中指定合适的 header 名称,用于获取 hash key 进行负载均衡。
hash_policy:
header:
header_name: "x-url"
或者,您可以考虑使用Istio作为中间代理,它使用 Envoy 的扩展版本。Kubernetes 服务通过在整个环境中部署一个特殊的 sidecar 代理来参与服务网格,该代理拦截微服务之间的所有网络通信。Istio 还可以用于通过DestinationRule资源基于 HTTP 标头的具有会话亲和性的Hash一致负载平衡。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: example
spec:
host: my-service.default.svc.cluster.local
trafficPolicy:
loadBalancer:
consistentHash:
httpHeaderName: x-url
推荐阅读
- javascript - 没有嵌套循环的两个数组之间的检查和匹配?
- python - 有谁知道如何解决这个问题?“ TypeError:需要一个类似字节的对象,而不是'int'”
- php - 显示“on”而不是实际值的单选按钮
- javascript - 如何从 php 获取 javascript 中的 id 以显示数据
- javascript - 使用 tab 键时如何正确设置项目的焦点顺序
- http - 谷歌驱动 GET 请求,无需手动登录
- python - 谷歌云调试器快照报告“在线找不到代码...”,托管云上的 python 运行
- android - 使用后台线程更新 UI 的问题
- python-3.x - 无法使用 Python 在 Azure Blob 存储上创建容器
- ios - Flutter / Android Studio:你能在 Windows PC 上为 iOS 做一个构建吗?