首页 > 解决方案 > 在 NGINX-Ingress 上使用带有 SSL 直通的 Session Affinity (Cookies)

问题描述

TL;DR:我想在 K8s 中通过带有 SSL 直通的 nginx-ingress 控制器设置基于 cookie 的会话亲和性 - 可以这样做吗?


大家好,

我有一个正在运行的 Azure Kubernetes 服务 (AKS) (1.11.3),并已将NGINX-Ingress控制器配置为将请求路由到我的应用程序的 ClusterIP 服务(至少运行 2 个 Pod)。

我已经在入口控制器上成功配置了 SSL 直通,以便 TLS 在 Pod 处终止,因此我可以使用 HTTP2(根据本文)。现在我想设置会话关联(使用 Cookie),以便将连接路由到同一个 pod 以实现有状态的行为(登录到应用程序)。

为此,我尝试在入口对象上使用以下注释:

nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/session-cookie-hash: "sha1"

但是,我没有看到第一个请求返回的“路由”cookie。我已经解决了这里描述的问题,并确保入口设置正确。然后我在文档中发现了这条消息中发现了这条消息:

因为 SSL Passthrough 在 OSI 模型 (TCP) 的第 4 层而不是第 7 层 (HTTP) 上工作,所以使用 SSL Passthrough 会使 Ingress 对象上设置的所有其他注释无效。

:这是否意味着使用带有 SSL 直通的会话亲和性是不可能的?因为 Ingress 无法识别连接/cookie(因为它是 SSL 加密的)并将其定向到先前关联的 pod?

标签: sslnginxkubernetesazure-akssession-affinity

解决方案


简短的回答:不,这是不可能的。第 4 层不知道 http 是什么,它只是看到字节来回流动。相反,您可以基于 IP 地址进行关联,而不是使用 cookie,因为它需要第 7 层代理解决方案。根据您的情况,您可以在第 7 层运行代理,该代理能够解密流量,然后使用另一个证书对其进行加密以供内部使用。所有有效负载(例如减去 SNI)都没有按照 SSL 加密,这意味着为了对 cookie 进行某种关联,代理需要在检查数据之前对其进行解密。


推荐阅读