NJET 向ADC注册
1.功能描述
背景及需求
为支持部署更多的OpenNJet 实例并且能够实现水平扩展,需要在和前端4层LB 协调的基础上,满足以下需求:
1.前端LB设备仅仅负责4层的流量转发
2.OpenNJet可根据业务规模做水平扩容
3.OpenNJet通过前端设备提供的API接口向前端设备进行注册
4.外部client 通过域名访问不同的服务
实现方案
流程说明
- ADC创建应用池Pool1, 监听IP1:port1(应用负载部分创建虚拟服务器和应用池)
- ADC设置内部DNS服务器(全局负载部分设置侦听器)
- ADC设置域名(app1.api.exm.com)和应用池(Pool1)绑定关系(全局负载部分创建虚拟服务器和应用池)
- 内部DNS要注册到实际的外部DNS
- OpenNJet启动或者重启后(可以是原生的OpenNJet实例也可能是通过KIC启动的OpenNJet服务实例),调用API接口向应用池Pool1注册member(OpenNJet实际的ip和端口)
- client访问app1.api.exm.com, 通过外部dns,转发到内部dns,通过内部dns解析得到实际的应用池Pool1的IP1:port1,作为解析结果,返回给client
- client通过IP1:port1(host:app1.api.exm.com)访问,由ADC设备通过4层协议转发到实际的OpenNJet的ip和端口,并且proxy到实际的业务app1
2.依赖模块
njet_ctrl.conf:
load_module modules/njt_http_register_module.so;
load_module modules/njt_http_lua_module.so;
3.指令说明
Syntax | register config={config} server={server} port={port} location={location}; |
---|---|
Default | register config=conf/register.json server=127.0.0.1 port=8081 location=/adc; |
Context | http |
参数说明:
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
config | string | conf/register.json | 注册信息 |
server | string | 127.0.0.1 | 控制面ip |
port | int | 8081 | 控制面端口 |
location | string | /adc | 控制面注册location |
其中register.json格式如下:
{
"type":"ADC",
"username":"******",
"password":"****** ",
"address":"192.168.40.136:80",
"login_api": "https://192.168.40.180:10443/adc/v3.0/login",
"pool_register_api" : "https://192.168.40.180:10443/adc/v3.0/slb/pool/9ae62b69-a98e-42c0-9b8b-30a53f9e5139/rserver/"
}
注册信息字段说明:
字段 | 说明 |
---|---|
type | 设备类型,目前支持ADC设备 |
username | 设备登录用户名 |
password | 设备登录密码 |
address | 注册的OpenNJet实例地址 |
login_api | 登录api(URL中的IP和端口为ADC设备的地址) |
pool_register_api | 应用池注册api,路径里使用的时应用池的uuid,可以通过通过浏览器在ADC页面按F12查看相关http请求的响应等方式得到对应应用池的uuid |
4.配置样例
njet.conf 主配置不需要任何配置
helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
helper ctrl modules/njt_helper_ctrl_module.so conf/ctrl.conf;
load_module modules/njt_http_split_clients_2_module.so;
load_module modules/njt_agent_dynlog_module.so;
load_module modules/njt_http_location_module.so;
load_module modules/njt_http_dyn_bwlist_module.so;
load_module modules/njt_dyn_ssl_module.so;
load_module modules/njt_http_vtsc_module.so;
cluster_name helper;
node_name node1;
worker_processes auto;
error_log logs/error.log info;
pid logs/njet.pid;
events {
worker_connections 1024;
}
http {
dyn_kv_conf conf/iot-work.conf;
include mime.types;
include conf.d/*.conf;
upstream backend {
server localhost:8002;
server localhost:8003;
}
server {
listen 8001;
server_name localhost;
location / {
proxy_pass http://backend;
}
}
server {
listen 8002;
server_name localhost;
location / {
return 200 "80028002";
}
}
server {
listen 8003;
server_name localhost;
location / {
return 200 "80038003";
}
}
}
njet_ctrl.conf
load_module modules/njt_http_sendmsg_module.so;
load_module modules/njt_ctrl_config_api_module.so;
load_module modules/njt_doc_module.so;
load_module modules/njt_http_register_module.so; ##依赖该模块
load_module modules/njt_http_lua_module.so; ##依赖该模块
cluster_name helper;
node_name node1;
error_log logs/error-ctrl.log info;
events {
worker_connections 1024;
}
http {
dyn_sendmsg_conf conf/iot-ctrl.conf;
config_req_pool_size 1000;
access_log logs/access_ctrl.log combined;
register config=conf/register.json server=127.0.0.1 port=8088 location=/adc; #也可以不配置,不配置,则都是用默认值
include mime.types;
include mime.types;
lua_package_path "/home/njet/test_adc/work/etc/njet/lualib/lib/?.lua;$prefix/scripts/?.lua;;"; #设置lua库动态路径
server {
listen 8088;
location /api {
dyn_module_api;
}
location /doc {
doc_api;
}
location /metrics {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
#配置 adc url, 加载lua代码
location /adc {
content_by_lua_file objs/scripts/http_register.lua;
}
}
}
ADC 配置步骤
ADC设备安装完只有管理口IP,需要配置业务口IP, 步骤如下:
管理口IP 安装完默认是10.10.254.254, 访问其web页面: https://10.10.254.254:10443
通过网络->vlan管理-> 设置,然后添加一个主ip,配置一个业务口ip,需要与管理口ip是不同网段,此处设置为192.168.40.180, web配置设置为on, 此后可以通过该ip也可以访问其web界面,地址: https://192.168.40.180:10443
配置侦听ip(也就是内部dns设置)
全局负载本身就是dns, 此处用业务口ip(192.168.40.180)作为dns ip使用(理论上随便设置一个虚拟ip即可)
配置域名和公网ip
比如此处想注册一个app1.njet.com的域名,公网ip地址假设为192.168.40.222:5000
先在全局负载创建应用池(设置公网ip地址192.168.40.222:5000),
然后在设置处添加一个成员,ip设置为公网ip地址192.168.40.222:5000
然后在全局负载虚拟服务器添加一个虚拟服务器(设置域名 app1.njet.com),引用上面创建的应用池完成域名和ip的关联,
配置公网ip和NJET应用池
应用负载添加应用池(可以通过浏览器F12查看相关http请求的响应得到对应应用池的uuid信息,此uuid作为OpenNJet注册时使用)
比如此处想为域名app1.njet.com 的服务设置一个OpenNJet应用池(取名叫OpenNJet_pool),以后OpenNJet注册的地址会添加到此应用池,作为该应用池的一个member成员
我们之后OpenNJet完成注册应用池,在设置处就会看到我们注册的地址,可以看到我们OpenNJet注册了三个地址
应用负载添加虚拟服务器,设置公网ip地址192.168.40.222:5000,应用池引用上面创建的应用池OpenNJet_pool
经过上面的步骤就完成了所有的配置,可以通过在自己的机器,设置dns为侦听器地址(192.168.40.180),然后通过curl 去访问OpenNJet 服务:比如,
curl http://app1.njet.com:5000/
app1.njet.com 为我们上面配置的OpenNJet服务的域名,5000端口为公网ip地址的端口,通过上面的访问,就会将请求转发到我们注册的OpenNJet服务
5.调用样例
将访问机器的dns设置为ADC设备设置的dns(此处测试dns地址为192.168.40.180)
然后curl访问域名,实际可以访问到真正的OpenNJet服务(域名+公网port, 此处8888为在ADC设备上配置的公网端口), 会实际访问8002和8003(默认轮询算法)