首页 > 解决方案 > 基于 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)可以,但我只看到“目标散列”和“源散列”作为负载平衡算法,我也不知道如何配置它。

标签: kuberneteshaproxyenvoyproxy

解决方案


正如您已经提到的,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

推荐阅读