{T}

入口网关服务注册发现-OpenResty 动态 upstream

0. 引言

Nginx 的 upstream 配置是静态的,后台节点扩容缩容时只能手工改配置重启,无法做到实时感知。本文讲解入口网关服务注册发现的场景与意义,并基于 OpenResty + Lua 演示一套支持动态添加、删除、监控 upstream 节点的方案。

1. 动态 Upstream 场景

典型场景:入口流量经 Nginx 网关通过 upstream 负载均衡分发给后台 real server(App server 1、App server 2)。当集群新增一台 App server 3 时,希望流量能自动(非手工)分发给新节点,就需要动态配置 upstream。

2. 实现意义

节点将自身信息(负载情况、服务状态、连接信息、服务名称等)实时上报给管理中心,管理中心收集节点状态后,根据策略动态调整 Nginx 的 upstream 配置:

  • 某 real server 负载过高时,动态添加新节点实现扩容;
  • 节点故障时动态摘除,实现故障感知与缩容。

如果 upstream 靠手工调整(改配置 + 重启服务),无法做到自动化与实时触发。在 K8s 场景中,ETCD 作为服务注册发现的 KV 存储,保存后台节点服务(服务名称、连接方式等)的注册信息;入口网关(Nginx)监听 etcd 数据变化,动态调整 upstream 配置,这就是 K8s 动态入口网关的理论原理。

3. 三种实现方式

方式说明
Nginx + Lua(OpenResty)用 Lua 开发动态调用接口
开源组件confd 工具、nginx-upsync-module 模块
独立入口网关替换Kong、Traefik 等云原生网关

Nginx 默认配置模块对动态 upstream 支持有限,本文演示基于 OpenResty 的方案:OpenResty 是 Nginx 与 Lua 结合的高性能 Web 平台,内置大量 Lua 库与第三方模块,免去手工编译 Lua 模块的繁琐。

动态 upstream 接口方案

该方案提供三个接口,让 OpenResty 支持添加、删除、监控 upstream 后台节点,管理中心或配置中心通过调用这三个接口动态修改入口网关的负载均衡配置。

4. 演示:OpenResty 动态 Upstream

4.1 安装与配置

  • 参考官方文档安装 Nginx 与 OpenResty;
  • Nginx 在此演示中作为 real server 节点:配置 81、82、83 三个端口的三份虚拟主机配置,启动后分别显示 Server 1/2/3 页面,模拟三个后台 HTTP 服务;
  • OpenResty 作为代理网关做负载均衡:主配置文件 nginx.conf 引用 ngx_lua 目录下的三个 Lua 脚本——upsops.lua(动态调节 upstream 节点信息的接口)、upstream.lua(负载均衡策略)、节点信息获取脚本;
  • 对外提供根访问路径(反向代理到三台虚拟主机,balancer_by_lua_file 修改默认负载均衡策略)和 location=/ups(动态更新 upstream 节点信息的接口)。

4.2 upsops.lua 核心逻辑

  • 获取请求参数与客户端请求方法(OP),支持 add(添加)与 del(删除)两种操作;
  • 校验请求参数后,通过 down_server 函数控制:upstream 后台 real server 至少保留一台主机,不允许删到零台;
  • 根据 OP 选择添加或删除节点,成功与失败均有对应提示信息。

4.3 测试验证

启动 OpenResty(800 端口)后访问测试:

  1. 轮询展示:刷新页面依次出现 server 1、2、3,说明负载均衡轮询生效;
  2. 删除节点:调用 ups 接口删除 83 端口节点,返回 200 与删除成功提示,刷新页面只轮询 server 1 和 2,不再出现 server 3;
  3. 添加节点:把操作改为 add 加回 83 节点,server 3 恢复轮询。

整个过程全部通过调用 HTTP API 接口实现,模拟动态发现时,管理或注册中心只需通过 HTTP API 即可动态调整 upstream 配置。

5. 小结

动态 upstream 解决了静态配置无法实时跟随后端节点变化的问题:节点上报状态 → 管理中心决策 → 网关接口调整 → 流量自动分流。三种实现方式中,OpenResty + Lua 适合已有 Nginx 体系、需要定制接口的场景;confd/nginx-upsync 适合快速接入;Kong/Traefik 适合云原生新建场景。理解这套"注册 + 发现 + 动态调整"的机制,也就理解了 K8s 入口网关服务注册发现的本质。

下一章讲解 4、7 层入口负载均衡 SLB 的设计,看 LVS 四种模式如何选型与优化。