在Kubernetes (k8s) 中,Service可以使用多种策略来分发流量到后端Pod。以下是一些主要的分发策略:
- ClusterIP (默认策略):
- Service会获取一个仅集群内部可访问的虚拟IP(ClusterIP),kube-proxy组件根据Service定义的SessionAffinity(如启用)和负载均衡策略将请求转发到后端Pod池。
- Round Robin:
- 默认的负载均衡策略是轮询(Round Robin),kube-proxy会按顺序将请求均匀地分配给后端Pod。
- Session Affinity (Client IP):
- 如您之前所述,可以通过设置
sessionAffinity: ClientIP
来实现基于客户端IP地址的会话保持。这意味着从同一个客户端IP发起的连续请求会被路由至同一后端Pod,直到会话超时或Pod不再可用。
- Session Affinity (cookie):
- Kubernetes 1.8版本及更高版本支持基于cookie的会话亲和性,这允许通过HTTP cookie来维持客户端会话与后端Pod的连接。
- Headless Service:
- 不提供ClusterIP的服务类型,它返回Pods的Endpoints列表而不做负载均衡,客户端可以直接与Pod通信。
- NodePort:
- 在每个节点上开启特定端口,让外部能够直接通过这个端口访问Service,负载均衡由kube-proxy在同一节点上的Pod间执行或者由外部负载均衡器完成。
- LoadBalancer:
- 如果云提供商支持,可以创建一个外部负载均衡器资源,它将暴露服务到公网,并根据配置的负载均衡策略将流量分发到各个Pod。
- ExternalName:
- 这种类型的服务不直接指向集群中的Pod,而是解析为一个外部DNS名称。
- IPVS (IP Virtual Server) 转发模式:
- 在kube-proxy中,可以配置使用IPVS作为代理模式以替换iptables,IPVS提供了更高效的负载均衡算法和更强的网络功能。
综上所述,每种策略的选择取决于应用需求、集群环境以及性能要求。