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

Using Session Affinity (Cookies) with SSL Passthrough on NGINX-Ingress

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


大家好,

我有一个可用的 Azure Kubernetes 服务 (AKS) 运行 (1.11.3) 并配置了 NGINX-Ingress 控制器以将请求路由到我的应用程序的 ClusterIP 服务(至少有共 2 pods 运行).

我已经在入口控制器上成功配置了 SSL 直通,以便 TLS 在 Pods 处终止,因此我可以使用 HTTP2(根据此 article)。现在我想设置 Session Affinity(使用 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"

但是,我没有看到第一个请求返回的 "route" cookie。我已经解决了描述的问题 here and ensured the ingress is setup correctly. Then I've spotted this message over at the docs:

Because SSL Passthrough works on layer 4 of the OSI model (TCP) and not on the layer 7 (HTTP), using SSL Passthrough invalidates all the other annotations set on an Ingress object.

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

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