TL; DR :我想在具有SSL直通的Nginx-ingress控制器上的K8中设置基于cookie的会话亲缘关系-可以做到吗?
嘿,
我有一个正在运行的Azure Kubernetes服务(AKS)(1.11.3),并且已配置NGINX-Ingress控制器以将请求路由到我的应用程序的ClusterIP服务(至少有两个Pod正在运行)。
我已经在入口控制器上成功配置了SSL直通,以便TLS在Pods处终止,因此我可以使用HTTP2(按照此article)。现在,我想设置会话亲和力(使用Cookies),以便将连接路由到同一个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中描述的问题,并确保正确设置了入口。然后,我在docs上发现了此消息:
因为SSL直通适用于OSI模型(TCP)的第4层,并且 不在第7层(HTTP)上,使用SSL传递会使所有 在Ingress对象上设置的其他注释。
Q :这是否意味着将会话亲和力与SSL传递功能结合使用已成为现实?如此一来,Ingress就无法识别连接/ Cookie(因为它已经过SSL加密)并将其定向到先前关联的Pod?
答案 0 :(得分:2)
简短的回答:不,这是不可能的。第4层不知道http是什么,它只是看到字节来回流动。您可以改为基于ip地址来具有亲和力,而不能与cookie一起使用,因为它需要7层代理解决方案。根据您的情况,您可以在第7层中运行代理,该代理将能够解密流量,然后使用另一个证书对其进行加密以供内部使用。所有的有效负载(例如,减去SNI)均未按照SSL进行加密,这意味着,为了对Cookie进行某种关联,代理将需要在检查数据之前对其进行解密。