单个服务暴露的多个 Pod 的会话亲和性设置

7
我已经在K8S群集中使用Metallb作为负载均衡器,并安装了Nginx Ingress。我已经了解了会话亲和性及其重要性,但到目前为止,我还没有一个清晰的图像。
如何创建一个单一的服务来公开相同应用程序的多个Pod? 创建单个服务入口点后,如何将特定客户端IP映射到由服务抽象的Pod?
是否有任何博客可以从Kubernetes的角度解释这个概念,即客户端IP和POD之间的映射是如何完成的?
但是,我在YAML文件中看不到客户端的IP地址。那么,该服务将如何将流量映射到各自的客户端到达端点?这是我的问题。
kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10000

因为您正在使用nginx作为入口控制器,我们正在谈论HTTP会话,这意味着您需要在入口规则中设置cookie粘性。如果您进入nginx入口控制器的GitHub存储库,您将找到许多示例。 - c4f4t0r
@c4f4t0r 我想在使用基于 cookie 的会话亲和力之前先使用普通的会话亲和力。此外,我还想验证并查看客户端请求是否基于其 IP 映射到 Pod。 - Pert8S
如果您的Web应用程序基于IP进行粘性,那么效果并不好,因为对于移动用户来说,IP地址可能会多次更改。 - c4f4t0r
我正在尝试首先验证这个功能。对于使用粘性会话的Web应用程序而言,您是正确的。那是会话控制的更高级部分,我想我需要先学习基本映射。 - Pert8S
2个回答

9
会话亲和力的主要概念是将流量始终从一个客户端重定向到特定的节点。请记住,会话亲和力是一种尽力而为的方法,存在Pod重启或网络错误等情况可能导致其失败。
会话亲和力有两种主要类型:
1) 基于客户端IP
该选项适用于每个IP只有一个客户端的场景。在此方法中,您无需在K8s服务和客户端之间使用Ingress/Proxy。因为每次客户端更改IP时,他将被重定向到另一个pod,所以客户端IP应该是静态的。
要在kubernetes中启用会话亲和力,我们可以将以下内容添加到服务定义中。
service.spec.sessionAffinity: ClientIP

由于社区提供了适当的清单来使用此方法,因此我不会重复。

2) 基于Cookies

当同一IP有多个客户端时,它可以工作,因为它存储在Web浏览器级别。此方法需要Ingress对象。有关应用此方法的步骤以及更详细的信息,请参见此处下面的基于Cookie的会话亲和力部分。

  • 创建NGINX控制器部署
  • 创建NGINX服务
  • 创建Ingress
  • 将您的公共DNS名称重定向到NGINX服务的公共/外部IP。

关于映射ClientIP和POD,根据文档, kube-proxy负责Session Affinity。Kube-Proxy的工作之一 是写入IPtables,更多细节请参见此处,所以就是这样映射的。

可能有助于理解会话亲和力的文章: https://sookocheff.com/post/kubernetes/building-stateful-services/ https://medium.com/@diegomrtnzg/redirect-your-users-to-the-same-pod-by-using-session-affinity-on-kubernetes-baebf6a1733b


1

遵循会话亲和力的服务引用

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10000

是的,到目前为止我已经看到这个YAML在各个地方都被用作示例。但是我在YAML中没有看到客户端的IP地址。这个服务将如何将流量映射到相应的客户端终点?这是我要问的问题。 - Pert8S
会话亲和性:客户端IP - P Ekambaram
以上属性将基于客户端IP将流量路由到相同的后端Pod。 - P Ekambaram
我们需要在Ingress文件中进行任何更改吗?还是仅对服务文件进行以上粘性会话配置就足够了。 - vijay
是的,您可能需要启用 nginx.ingress.kubernetes.io/affinity。 - P Ekambaram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接