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 策略决定丢弃/接受还是转发包。
阅读全文