基于TCP有效载荷对一组动态服务器进行一致的哈希处理。

问题描述 投票:0回答:1

我有一个场景,我需要通过代理(如HAProxy或nginx)将TCP流量路由到一组动态的后端服务器(确切地说,是Kubernetes pods,但我们可以忽略这一点)。流量需要根据一个密钥(称它为 路由键)由客户端在TCP有效载荷中提供。

我看到nginx和HAProxy都支持一致的哈希。然而,根据我所知道的HAProxy的 手册 (见 "平衡 "部分),没有办法基于TCP有效载荷执行一致的哈希。基于有效载荷的负载均衡似乎仅限于L7 HTTP参数,比如Header和URI params。这篇文章 概述了一种基于TCP有效载荷匹配字符串的静态平衡方法,但我的情况更多的是动态的,所以真正一致的哈希方法更受欢迎。

Nginx似乎提供了更多的灵活性,因为你可以将散列值设置为一个任意的变量。如图. 这似乎对L7("后台 "部分)和L4("流 "部分)都有效。然而,我对你可以和不可以为变量做什么有点模糊。有谁能举个例子,将一个变量设置为从TCP有效载荷中提取的值,并使用该值进行一致的哈希?

最后一个额外的问题 路由键 值实际上是一个AES-GCM加密值。代理服务器可以访问用于解密该值的密钥。是否可以让nginx从TCP有效载荷中抓取路由密钥值,使用已知的密钥进行解密,然后使用该密钥进行一致的哈希?这是否需要创建一个nginscript模块?

nginx networking tcp haproxy consistent-hashing
1个回答
3
投票

在HAProxy 2.1中,你可以使用以下功能吗?aes_gcm_dec(...)对于这样的需求,req.payload(...) 来满足这样的需求。

我的想法,未经测试。

listen tcp-in
  bind :443 ssl cert 
  tcp-request inspect-delay 10s
  tcp-request session set-var(sess.routingkey) req.payload(0,500)

  # for consistent hashing try this
  hash-type consistent wt6

  use_backend %[var(sess.routingkey),aes_gcm_dec(128,txn.nonce,Zm9vb2Zvb29mb29wZm9vbw==,txn.aead_tag)]

这里也有html文档的链接。aes_gcm_dec req.payload hash-type consistent ... 叙述于 散列型

© www.soinside.com 2019 - 2024. All rights reserved.