K8s-Service的负载均衡机制

Service对象通过关联转发到PodI实现负载均衡,每个Node的kube-proxy负责实现。

kube-proxy的代理模式

通过启动参数–proxy-mode设 置

userspace模式(x)

用户空间模式,由kube-proxy完成的代理模式,效率低,不再推荐

iptables模式

kube-proxy通过设置Linux Kernel的iptables规则, 实现从Service到后端Endpoint列表的负载分发规则,效率很高。但是, 如果某个后端Endpoint在转发时不可用,此次客户端请求就会得到失败 的响应,相对于userspace模式来说更不可靠。

此时应该通过为Pod设置 readinessprobe(服务可用性健康检查)来保证只有达到ready状态的 Endpoint才会被设置为Service的后端Endpoint。

ipvs模式

在Kubernetes 1.11版本中达到Stable阶段,kubeproxy通过设置Linux Kernel的netlink接口设置IPVS规则,转发效率和支 持的吞吐率都是最高的。ipvs模式要求Linux Kernel启用IPVS模块,如果 操作系统未启用IPVS内核模块,kube-proxy则会自动切换至iptables模 式。

支持更多负载均衡策略:

  1. rr:round-robin,轮询
  2. lc:least connection,最小连接数
  3. dh:destination hashing,目的地址哈希
  4. sh:source hashing,源地址哈希。
  5. sed:shortest expected delay,最短期望延时
  6. nq:never queue,永不排队

kernelspace模式

Windows Server上的代理模式。

会话保持机制

Service支持通过设置sessionAffinity实现基于客户端IP的会话保持机制,即首次将某个客户端来源IP发起的请求转发到后端的某个Pod上, 之后从相同的客户端IP发起的请求都将被转发到相同的后端Pod上,配 置参数为service.spec.sessionAffinity

apiVersion: v1
kind: Service
metadata:
name: sessionService
spec:
# 设置
sessionAffinity: ClientIP
# 会话保持时间
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
selector:
app: sessionService
ports:
- protocol: TCP
port: 80
targetPort: 8080