在 NGINX-Ingress 上使用会话关联性 (Cookie) 和 SSL 直通

Mat*_*ard 2 ssl nginx kubernetes session-affinity azure-aks

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"
Run Code Online (Sandbox Code Playgroud)

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

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

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

use*_*801 5

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