【问题标题】:Kubernetes services : request Assignment algorithmKubernetes 服务:请求分配算法
【发布时间】:2021-05-20 18:38:01
【问题描述】:
kubernets 服务使用什么逻辑算法将请求分配给它公开的 pod?这个算法可以定制吗?
谢谢。
【问题讨论】:
标签:
kubernetes
kubernetes-pod
【解决方案1】:
用户空间模式下的 kube-proxy 通过循环算法选择后端。
iptables 模式下的 kube-proxy 随机选择一个后端。
IPVS 提供了更多用于平衡后端 Pod 流量的选项;它们是:rr:循环,lc:最少连接(打开连接的最少数量),dh:目标哈希,sh:源哈希,sed:最短预期延迟,nq:从不排队
这里提到:- Service
对于应用程序级路由,您需要使用像 istio ,envoy, kong 这样的服务网格。
【解决方案2】:
您可以使用组件kube-proxy。这是什么?
kube-proxy 是一个网络代理,在集群中的每个 node 上运行,实现了 Kubernetes Service 概念的一部分。
kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
kube-proxy 使用操作系统包过滤层(如果有并且可用)。否则,kube-proxy 会自行转发流量。
但是当有round-robin DNS algorithm 时为什么要使用代理呢?为服务使用代理有几个原因:
- 长期以来,DNS 实施不尊重记录 TTL,并且在名称查找的结果本应过期后对其进行缓存。
- 有些应用只进行一次 DNS 查找,并无限期地缓存结果。
- 即使应用和库进行了适当的重新解析,DNS 记录上的低 TTL 或零 TTL 也可能会给 DNS 带来高负载,从而变得难以管理。
kube-proxy 有多种模式:
-
User space proxy mode - 在用户空间模式下,iptables 规则转发到 go 二进制文件 (kube-proxy) 正在侦听连接的本地端口。二进制文件(在用户空间中运行)终止连接,为服务建立到后端的新连接,然后将请求转发到后端并响应回本地进程。用户空间模式的一个优点是,由于连接是从应用程序创建的,如果连接被拒绝,应用程序可以重试到不同的后端
-
Iptables proxy mode - 在 iptables 模式下,安装 iptables 规则以将发往服务的数据包直接转发到服务的后端。这比将数据包从内核移动到 kube-proxy 然后再返回内核更有效,因此它可以带来更高的吞吐量和更好的尾部延迟。主要的缺点是它更难调试,因为您必须检查来自内核处理 iptables 规则的日志,而不是将日志写入
/var/log/kube-proxy 的本地二进制文件。
-
IPVS proxy mode - IPVS 是专为负载平衡而设计的 Linux 内核功能。在 IPVS 模式下,kube-proxy 对 IPVS 负载均衡器进行编程,而不是使用 iptables。这行得通,它还使用了成熟的内核功能,并且 IPVS 设计 用于负载平衡大量服务;它具有优化的 API 和优化的查找例程,而不是顺序规则列表。
您可以阅读更多 here - StackOverflow 上关于代理模式的好问题,here - 比较代理模式和 here - 关于代理模式的好文章。
就像他的回答中提到的rohatgisanat,您也可以使用service mesh。这里还有一篇关于 Kubernetes 服务网格的好文章comparsion。