基于TenantId实现Ingress会话粘性与负载均衡的配置咨询
基于TenantId的会话粘性与负载均衡配置方案
核心需求回顾
通过请求Header/Cookie中的TenantId实现会话亲和,同时保证每个PowerShell Pod承载的租户数量最少;仅当所有Pod都分配了租户后,才将新租户随机分配到任意Pod。
Nginx Ingress 实现方案
Nginx Ingress可直接通过配置满足需求,利用一致性哈希算法基于TenantId分配请求,同时保证负载均匀。
配置思路
优先提取Header中的TenantId,无Header则取Cookie中的值作为哈希键,通过一致性哈希映射到后端Pod。该算法能保证不同TenantId均匀分散到各Pod,且Pod扩容缩容时仅少量租户的映射会变动。
具体Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: powershell-service-ingress annotations: nginx.ingress.kubernetes.io/configuration-snippet: | # 优先使用Header的TenantId, fallback到Cookie map $http_tenantid $tenant_hash_key { default $cookie_TenantId; ~.+ $http_tenantid; } nginx.ingress.kubernetes.io/upstream-hash-by: "$tenant_hash_key" spec: rules: - host: your-domain.com http: paths: - path: /powershell pathType: Prefix backend: service: name: powershell-listener-service port: number: 80
HAProxy Ingress 实现方案
HAProxy同样支持基于TenantId的一致性哈希路由,适配现有集群环境。
配置思路
通过自定义ACL提取TenantId,使用一致性哈希算法将相同TenantId的请求固定到同一Pod,同时保证负载均衡。
具体Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: powershell-service-ingress annotations: haproxy.org/configuration-snippet: | # 提取TenantId作为哈希键 http-request set-var(req.tenant_id) req.hdr(TenantId) if { req.hdr(TenantId) -m found } http-request set-var(req.tenant_id) req.cookie(TenantId) if { req.cookie(TenantId) -m found } balance hash var(req.tenant_id) consistent spec: rules: - host: your-domain.com http: paths: - path: /powershell pathType: Prefix backend: service: name: powershell-listener-service port: number: 80
自定义路由Pod选型(若Ingress方案无法满足精细化需求)
如果需要更灵活的租户-Pod映射控制(比如动态调整负载阈值、实时监控租户分布),可以选择以下方案:
- Envoy Proxy:作为独立路由Pod或Sidecar,通过Wasm插件或Lua脚本实现自定义路由逻辑。Envoy原生支持Kubernetes服务发现,弹性扩容只需调整Pod副本数,性能优异且生态成熟。
- Spring Cloud Gateway:基于Java生态的网关服务,编写自定义过滤器即可实现TenantId的负载均衡与会话粘性。它天然适配Kubernetes,扩容简单,适合熟悉Spring技术栈的团队。
- 轻量自定义服务:用Go/Node.js编写极简路由服务,维护租户-Pod映射表,新租户到来时分配到当前负载最低的Pod。这种方案灵活性最高,但需要自行实现服务发现和健康检查逻辑,适合有开发能力的团队。
内容的提问来源于stack exchange,提问作者Ayibogan
相关产品推荐
相关产品推荐

