ZxYuan/zxyuan.me

Nginx ingress controller动态负载均衡性能优化

Opened this issue · 0 comments

问题描述&性能曲线及原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%以上的单核计算资源。
cpu_usage_by_svc_num

性能优化

本次的PR提出在controller进程访问"/configuration/backends" API以更新路由规则时记录一个时间戳,每秒轮询时,每个lua进程通过最近一次记录的本地时间戳检查是否需要触发全量的更新,不需要则忽略该次更新。

应用此优化过后,相同规模的集群条件下,单核CPU利用率降低至3%以下。按项目计划将于0.34版本应用此优化。