【问题标题】:Does sessionAffinity over ClientIP works with UDP protocol on Kubernetes setup?ClientIP 上的 sessionAffinity 是否适用于 Kubernetes 设置上的 UDP 协议?
【发布时间】:2021-10-27 06:51:16
【问题描述】:

可以说,我们有两个独立的 Kubernetes 集群Cluster 1 & Cluster 2 ,每个集群都有同一个应用程序 Pod 的两个副本。喜欢 Cluster 1 : Pod A & Pod B Cluster 2 : Pod C & Pod D Pod A(客户端)中的应用程序代码希望通过 UDP 协议通过 NodePort/Loadbalancer 服务连接到集群 2 中运行的任何 Pod 以发送消息。唯一的要求是保持亲和性,以便来自 Pod A 的所有消息只能发送到任何一个 Pod(Pod C 或 Pod D)。由于 UDP 是一种无连接协议,我关心的是基于 ClientIP 的会话关联。将 sessionAffinity 设置为客户端 IP 是否可以解决我的问题?

【问题讨论】:

    标签: kubernetes udp openshift kubernetes-helm


    【解决方案1】:

    由于 UDP 是一种无连接协议,我关心的是基于 ClientIP 的会话 Affinity。将 sessionAffinity 设置为客户端 IP 是否可以解决我的问题?

    sessionAffinity 保持每个会话基于 sourceIP,而不管同一集群中的协议如何。但这并不意味着您的真实会话在您的整个访问路径旅程中都保持在您的环境中。 换句话说,仅使用 sessionAffinity 并不能确保将整个会话保持在您的访问路径上。

    例如,如果您不为 Pod A 使用出口 IP 解决方案,则 Pod A 出站 IP 将被转换为运行节点 IP(SNAT)。 它还取决于集群 2 中关于源 IP 的 NodePort 和 LoadBalancer 服务配置。有关详细信息,请参阅 Using Source IP。

    因此您应该考虑如何在其他集群之间相互访问时安全地保持会话。我个人认为您最好考虑应用层(7Layer)粘性会话来保持会话,而不是服务的 sessionAffinity。

    【讨论】:

    • 嗨@Daein,感谢您的回答。实际上,在我的情况下,从 POD A 到 POD C 的第一个连接是在 TCP 上,POD C 作为响应告诉 POD A 需要启动其他新连接的 UDP 端口。在这里,要求是服务于 TCP 请求的服务器端的 POD,也应该只接收 UDP 请求。我正在尝试这种情况,但随后的 UDP 请求落在服务器端的其他 POD 中。我在 ClientIP 上没有看到 sessionAffinity 的影响。
    • @Nish 不幸的是,我认为跨 TCP 和 UDP 的会话不会使用 sessionAffinity。这是作为 iptables 规则实现的,它基本上是执行 tcp 或 udp 规则,而不是一个一个时间点的混合协议。
    • 哦!实在是太可惜了!您是否知道处理这种情况的任何其他解决方法?
    • @Nish 这是一个不寻常的用例,那么如何消除特定 pod 对您的应用程序的依赖?或者您可以考虑使用每个部署在后端保留一个 pod。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2020-06-04
    • 2023-03-19
    • 1970-01-01
    • 2016-10-09
    相关资源
    最近更新 更多