Nginx ingress controller动态负载均衡性能优化
Opened this issue · 0 comments
ZxYuan commented
问题描述&性能曲线及原PR: kubernetes/ingress-nginx#5418
已Merge PR: kubernetes/ingress-nginx#5726
Nginx ingress controller动态负载均衡的实现(截止0.33版本)与性能瓶颈
Nginx ingress controller动态负载均衡由nginx lua脚本实现,使用shared_dict在多个worker进程(lua进程)**享全量路由规则,这样的优势在于:仅后端pod发生变更时不会引发nginx的配置修改及reload,仅更新内存中保存路由的lua table。
lua进程通过http API对ingress controller进程暴露全量路由规则的设置接口。一旦发生路由变更就通过此接口更新shared_dict中的全量路由规则,lua进程则每秒轮询shared_dict以更新table中的全量路由规则。
当前版本(0.33)及之前的版本都遵循这一逻辑,事实上在大集群中lua进程每秒轮询对CPU性能损耗非常明显,甚至影响在线请求的路由转发。6000+的service与ingress能够吃掉75%以上的单核计算资源。
性能优化
本次的PR提出在controller进程访问"/configuration/backends" API以更新路由规则时记录一个时间戳,每秒轮询时,每个lua进程通过最近一次记录的本地时间戳检查是否需要触发全量的更新,不需要则忽略该次更新。
应用此优化过后,相同规模的集群条件下,单核CPU利用率降低至3%以下。按项目计划将于0.34版本应用此优化。