NJET 向ADC注册

1.功能描述

背景及需求

为支持部署更多的OpenNJet 实例并且能够实现水平扩展,需要在和前端4层LB 协调的基础上,满足以下需求:

1.前端LB设备仅仅负责4层的流量转发

2.OpenNJet可根据业务规模做水平扩容

3.OpenNJet通过前端设备提供的API接口向前端设备进行注册

4.外部client 通过域名访问不同的服务

实现方案

img img

流程说明

  1. ADC创建应用池Pool1, 监听IP1:port1(应用负载部分创建虚拟服务器和应用池)
  2. ADC设置内部DNS服务器(全局负载部分设置侦听器)
  3. ADC设置域名(app1.api.exm.com)和应用池(Pool1)绑定关系(全局负载部分创建虚拟服务器和应用池)
  4. 内部DNS要注册到实际的外部DNS
  5. OpenNJet启动或者重启后(可以是原生的OpenNJet实例也可能是通过KIC启动的OpenNJet服务实例),调用API接口向应用池Pool1注册member(OpenNJet实际的ip和端口)
  6. client访问app1.api.exm.com, 通过外部dns,转发到内部dns,通过内部dns解析得到实际的应用池Pool1的IP1:port1,作为解析结果,返回给client
  7. 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

img img

配置侦听ip(也就是内部dns设置)

全局负载本身就是dns, 此处用业务口ip(192.168.40.180)作为dns ip使用(理论上随便设置一个虚拟ip即可)

img img

配置域名和公网ip

比如此处想注册一个app1.njet.com的域名,公网ip地址假设为192.168.40.222:5000

先在全局负载创建应用池(设置公网ip地址192.168.40.222:5000),

img img

然后在设置处添加一个成员,ip设置为公网ip地址192.168.40.222:5000

img img

然后在全局负载虚拟服务器添加一个虚拟服务器(设置域名 app1.njet.com),引用上面创建的应用池完成域名和ip的关联,

img img

配置公网ip和NJET应用池

应用负载添加应用池(可以通过浏览器F12查看相关http请求的响应得到对应应用池的uuid信息,此uuid作为OpenNJet注册时使用)

比如此处想为域名app1.njet.com 的服务设置一个OpenNJet应用池(取名叫OpenNJet_pool),以后OpenNJet注册的地址会添加到此应用池,作为该应用池的一个member成员 img img

我们之后OpenNJet完成注册应用池,在设置处就会看到我们注册的地址,可以看到我们OpenNJet注册了三个地址

img img

应用负载添加虚拟服务器,设置公网ip地址192.168.40.222:5000,应用池引用上面创建的应用池OpenNJet_pool

img img

经过上面的步骤就完成了所有的配置,可以通过在自己的机器,设置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)

img img

然后curl访问域名,实际可以访问到真正的OpenNJet服务(域名+公网port, 此处8888为在ADC设备上配置的公网端口), 会实际访问8002和8003(默认轮询算法) img img