kubernetes集群应该包含至少三个网络。
一个是各主机自身所属的网络,其地址配置于主机的网络接口,用于各主机之间的通信,例如master与各node之间的通信。
此地址配置于kubernetes集群构建之前,它并不能由kubernetes管理,管理员需要于集群构建之前自行确定其地址配置
及管理方式。
第二个是kubernetes集群上专用于pod资源对象的网络,它是一个虚拟网络,用于为各pod对象设定ip地址等网络参数,
其地址配置于pod中容器的网络接口之上。pod网络需要借助kubenet插件或CNI插件实现,该插件可独立部署于kubernetes
集群之外,亦可托管于kubernetes之上,它需要在构建kubernetes集群时由管理员进行定义,而后在创建Pod对象时由其
自动完成各网络参数的动态配置。
第三个是专用于service资源对象的网络,它也是一个虚拟网络,用于为kubernetes集群之中的service配置ip地址,
但此地址不配置于任何主机或容器的网络接口上,而是通过Node之上的kube-proxy配置为iptables或ipvs规则,从而将
发往此地址的所有流量调度至其后端的各pod对象之上。service网络在kubernetes集群创建时予以指定,而service的
地址则在用户创建service时予以动态配置
在 K8S 底层网络中,IPVS 的效率通常比 iptables 更高(面试考察)。
底层机制与性能天花板:
IPVS:是内核级四层负载均衡器,基于哈希表实现快速查找和转发,其查找复杂度接近 O (1),性能几乎不受规则
数量影响,能够支持 10 万 + 的并发连接。
iptables:是基于防火墙规则链的实现,规则匹配采用顺序匹配模式,即逐条遍历规则,时间复杂度为 O (n)。
当集群中服务和 Pod 数量增多时,规则数量会线性增长,性能会显著下降,一般在 5000 + 连接时性能就会骤降。规则更新方式:
IPVS:采用增量更新方式,仅修改变化的条目,规则更新耗时极短,可达毫秒级生效,能够快速应对集群中服务和
Pod 的变化,不会引起流量抖动。
iptables:在规则更新时需要全量重建,即重新写入数百条甚至更多规则,这一过程可能需要秒级延迟,还可能导致
服务抖动甚至中断。负载均衡算法:
IPVS:支持多种负载均衡算法,如轮询(rr)、加权轮询(wrr)、最少连接(lc)、加权最小连接(wlc)、
源地址哈希(sh)、目标地址哈希(dh)等,能够根据不同的业务场景选择合适的算法,实现更灵活的流量分发。
iptables:仅支持随机和轮询两种简单的负载均衡策略,无法根据后端 Pod 的负载情况动态调整流量,
在一些对负载均衡策略要求较高的场景下,无法满足需求。内存占用:
IPVS:内存占用相对固定,约为 30MB。
iptables:每增加一个服务,内存占用会相应增加约 0.5MB,在大规模集群中,随着服务数量的增多,
内存占用会逐渐增大。
评论 (0)