我在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
答案 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中找到应用此方法的详细信息的步骤。
根据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