7

我将 Metallb 设置为 LB,并在 K8S 集群上安装了 Nginx Ingress。我已经阅读了有关会话亲和力及其重要性的信息,但到目前为止我还没有清楚的了解。

如何创建一个服务来公开同一应用程序的多个 pod?创建单服务入口点后,如何将具体的客户端 IP 映射到服务抽象的 Pod 上?

是否有任何博客根据客户端 IP 和 POD 之间的映射如何在 kubernetes 中完成来解释这个概念?

但我在 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
4

2 回答 2

7

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

1) 基于客户端 IP

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

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

service.spec.sessionAffinity: ClientIP

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

2) 基于 Cookie

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

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

关于映射 ClientIP 和 POD,根据文档 kube-proxy 负责 SessionAffinity。Kube-Proxy 的一项工作是写入 IPtables,这里有更多详细信息,这就是它的映射方式。

可能有助于理解 Session Affinity 的文章: 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

于 2019-06-12T10:40:12.980 回答
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
于 2019-05-27T11:39:37.850 回答