我有一个场景,需要通过HAProxy或nginx这样的代理将TCP流量路由到一组动态后端服务器(确切地说,这是Kubernetes吊舱,但我们可以忽略它)。流量需要基于客户端在TCP有效负载中提供的密钥(称为routing_key)进行路由。
我看到nginx和HAProxy都支持一致的散列。但是,根据HAProxy的手册 (参见"balance“部分),无法根据TCP有效负载执行一致的散列。基于有效负载的负载平衡似乎仅限于L7的HTTP参数,如标头和URI参数。这个职位概述了一种基于字符串匹配TCP有效负载的静态平衡方法,但我的例子更加动态,因此更倾向于采用真正一致的散列方法。
Nginx似乎提供了更多的灵活性,因为您可以将散列值设置为任意变量如图所示。这似乎既适用于L7 (“后端”节),也适用于L4 (“流”节)。但是,我对你是什么有点模糊,不允许对变量做任何事情。是否有人有将变量设置为从TCP有效负载中提取的值并将其用于一致散列的示例?
最后一个额外的问题:routing_key值实际上是一个AES-GCM加密值。代理服务器将有权访问用于解密此值的密钥。是否有可能让nginx从TCP有效负载中获取路由密钥值,使用已知密钥对其进行解密,然后将其用于一致散列?这需要创建一个nginscript模块吗?
发布于 2020-05-18 23:35:47
在aes_gcm_dec(...) 2.1中,可以将req.payload(...)与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文档的链接。
hash-type consistent ...在散列类型中有描述
https://stackoverflow.com/questions/61838813
复制相似问题