一项服务公开的多个Pod的会话关联性设置

时间:2019-05-27 09:39:22

标签: kubernetes kubernetes-ingress kubernetes-pod kubernetes-service

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

如何创建暴露同一应用程序的多个容器的单个服务? 创建单个服务入口点后,如何将特定的客户端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

2 个答案:

答案 0 :(得分:0)

遵循服务参考中的会话亲和力

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

答案 1 :(得分:0)

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

1) 基于客户端IP

此选项非常适合每个IP仅一个客户端的情况。在这种方法中,您不需要K8s服务和客户端之间的Ingress / Proxy。 客户端IP应该是静态的,因为客户端每次更改IP时,都会将其重定向到另一个Pod。

要在kubernetes中启用会话亲缘关系,我们可以在服务定义中添加以下内容。

service.spec.sessionAffinity: ClientIP

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

2) 基于Cookies

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

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

根据Documentation,关于映射ClientIP和POD   kube-proxy负责SessionAffinity。 Kube-Proxy工作之一   正在写入IPtables,更多详细信息here就是这样   映射。

可能有助于理解会话亲和力的文章: 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