Kubernetes Service 原理究竟是如何精妙运作的?
摘要:介绍 Kubernetes Service 用于流量的负载均衡和反向代理,其通过 kube-proxy 组件实现。从服务的角度来看,kube-controller-manager 实现了服务注册,kube-proxy 实现了 kuberne
介绍
Kubernetes Service 用于流量的负载均衡和反向代理,其通过 kube-proxy 组件实现。从服务的角度来看,kube-controller-manager 实现了服务注册,kube-proxy 实现了 kubernetes 集群内服务的负载均衡。
示意图如下:
kube-proxy 通过三种模式 userspace,iptables 和 IPVS 实现 Service 流量的负载均衡。userspace 不太常用,kube-proxy 自 v1.8 开始支持 IPVS,v1.11 GA。
iptables 和 IPVS 都是基于内核的 Netfilter 实现。iptables 基于 iptables 表匹配规则,复杂度为 O(n),IPVS 基于哈希表实现规则匹配,复杂度为 O(1)。详细对比如下:
性能对比测试:
场景
iptables 延迟
IPVS 延迟
提升幅度
100 Service(10 Pod)
2.1ms
1.3ms
38%
1000 Service(100 Pod)
11.4ms
2.9ms
75%
10000 Service(1000 Pod)
超时
3.2ms
100%
数据来源:Kubernetes 社区性能测试
多维度对比:
维度
iptables
IPVS
性能
低(O(n) 复杂度)
高(O(1) 复杂度)
扩展性
适合小规模集群
支持百万级 Service/Pod
算法
仅随机选择
10+ 种负载均衡算法
资源占用
高(规则链维护)
低(哈希表存储)
故障恢复
全量重载,可能抖动
增量更新,无感知
iptabls
iptables 介绍学习可参考 iptables,非常好的 iptables 学习资料,强烈推荐。
iptables 重点在五链五表,其示意图如下:
kube-proxy 通过在 INPUT,FORWARD,POST_ROUTING 链上添加钩子规则实现 Service 的负载均衡和反向代理。示意图如下:
图片来源于 公众号:云原生 Space
kubernetes v1.8 版本之前的 Service 负载均衡基于 iptables 实现,可以参考 一文看懂 Kubernetes 服务发现: Service 学习,本文重点关注在 IPVS 实现上。
ipvs
IPVS 提供 DNAT 和负载均衡,需要和 iptables 配合使用才能实现 Service 的流量转发。
结合 ClusterIP 看 kube-proxy ipvs 是如何实现流量负载均衡的。
Service ClusterIP
Kubernetes Service:
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 385d
ipvsadm 查看 svc 的负载均衡信息:
# ipvsadm -l -n | grep 10.233.0.1:443 -A 3
TCP 10.233.0.1:443 rr
-> 10.251.xxx.30:6443 Masq 1 18 2
-> 10.251.xxx.31:6443 Masq 1 25 0
-> 10.251.xxx.32:6443 Masq 1 13 1
输出部分元素解释:
rr: 表示负载均衡策略,默认是 rr。
Masq:负载均衡模式,Masq 指的是 NAT 模式。IPVS 支持 Direct Routing,Tunneling 模式,这两种都不支持端口映射,IPVS 使用的是 Masq 模式。
IPVS 提供如下负载均衡策略:
rr:轮询调度
lc:最小连接数
dh:目标哈希
sh:源哈希
sed:最短期望延迟
nq: 不排队调度
只有负载均衡信息并不能使集群内访问 ClusterIP 的流量转发到后端服务。流量首先需要经过内核,由内核根据 iptables 策略决定丢弃/接受还是转发包。
