ssl - 在 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?
解决方案
简短的回答:不,这是不可能的。第 4 层不知道 http 是什么,它只是看到字节来回流动。相反,您可以基于 IP 地址进行关联,而不是使用 cookie,因为它需要第 7 层代理解决方案。根据您的情况,您可以在第 7 层运行代理,该代理能够解密流量,然后使用另一个证书对其进行加密以供内部使用。所有有效负载(例如减去 SNI)都没有按照 SSL 加密,这意味着为了对 cookie 进行某种关联,代理需要在检查数据之前对其进行解密。
推荐阅读
- c# - 如何使用 int 数组作为字典键 C#
- nestjs - 什么是 typeorm 中的 Exactly One to many
- scrapy - Scrapy - 重复过滤和下载延迟
- rust - 基于宏规则生成元组索引!重复扩展
- c++ - 在 C++ 中打印某个数字是否是回文数
- python - Raspbian 在睡眠时检测键盘输入
- javascript - 使用 innerHTML 嵌套时的 DOM 待办事项列表
- html - 在背景图像上添加叠加层后的水平滚动条
- ios - 有没有办法在 Swift 中将当前迭代计数作为 Int 访问?
- javascript - CORS 请求未发送 cookie