单个服务公开的多个 Pod 的会话亲和性设置

Per*_*t8S 6 kubernetes kubernetes-ingress kubernetes-pod kubernetes-service

我有一个设置 Metallb 作为 LB,在 K8S 集群上安装了 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
Run Code Online (Sandbox Code Playgroud)

Pjo*_*erS 7

Session Affinity 的主要概念是将流量从一个客户端始终重定向到特定节点。请记住,会话关联是一种尽力而为的方法,并且在某些情况下它会由于 pod 重新启动或网络错误而失败。会话亲和性有两种主要类型:

1) 基于客户端IP

此选项适用于每个 IP 只有一个客户端的场景。在这种方法中,您不需要 K8s 服务和客户端之间的 Ingress/Proxy。客户端 IP 应该是静态的,因为每次客户端更改 IP 时,他都会被重定向到另一个 pod。

要在 Kubernetes 中启用会话关联,我们可以将以下内容添加到服务定义中。

service.spec.sessionAffinity: ClientIP
Run Code Online (Sandbox Code Playgroud)

因为社区提供了使用这种方法的正确清单,所以我不会重复。

2) 基于Cookies

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

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

关于映射ClientIP和POD,根据文档 kube-proxy负责SessionAffinity。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


P E*_*ram 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
Run Code Online (Sandbox Code Playgroud)