具有基于URL的相似性的服务代理

时间:2019-03-18 13:37:38

标签: kubernetes haproxy envoyproxy

我正在寻找具有基于URL的相似性的服务代理(或负载平衡器)。

这是在集群内部的Kubernetes中使用的:我正在寻找“内部”负载平衡器,不需要在外部公开服务。

默认情况下,Kubernetes中的服务使用的是“循环”算法。

我希望基于HTTP URL的一部分具有某种亲和力:第一个请求将发送到随机的Pod,随后使用相同URL的请求(最好)将进入同一Pod。

我已经阅读了一些有关基于sourceIP的相似性的文档,这是否基于URL存在?

我很快就了解了Envoy,也许可以使用“ Ring hash”负载平衡算法来做到,但是我不知道是否有可能基于URL进行哈希。

也许可以使用kube-proxy(https://kubernetes.io/docs/concepts/services-networking/service/#proxy-mode-ipvs)的“ ipvs”代理模式,但是我仅看到“目标哈希”和“源哈希”作为负载平衡算法,但我不知道如何配置它。

1 个答案:

答案 0 :(得分:0)

正如您已经提到的,IPVS代理算法定义了源IP地址和目标IP地址,以便生成用于负载平衡的唯一哈希键。但是,它在侦听TCP或UDP服务的网络流量的L4传输层中运行。因此,可能难以与HTTP请求进行交互并根据URL路径做出路由决策。

Envoy代理通过HTTP header内部指定的HTTP router filter值以及Ring hash负载均衡策略表示一致的哈希。因此,您可以在哈希策略中指定适当的标头名称,该标头名称可用于获取用于负载平衡的哈希键。

hash_policy:
  header:
    header_name: "x-url"

或者,您可以考虑将Istio用作使用Envoy扩展版本的中间代理。通过在整个环境中部署一个特殊的sidecar代理来拦截微服务之间的所有网络通信,Kubernetes服务将被纳入服务网格。 Istio还可以用于基于Hash资源基于HTTP标头的会话亲和性的DestinationRule一致的负载平衡。

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: example
spec:
  host: my-service.default.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      consistentHash:
        httpHeaderName: x-url