|
|
|
|
|
|
|
|
|
|
|
开启proxy_protocol v2。 on 开启, off 关闭
|
|
|
|
proxy_pp2_set_tlv key value 格式。key 是 16 进制(两位,要避免和标准的冲突,)。 value 可以是常量,变量。例如:proxy_pp2_set_tlv 0x31 test; 获取:$proxy_protocol_tlv_0x31 前缀变量。注意:包含前面的源ip,目标ip,源端口,目标端口,以及tlv 值,总长度不能超过 4096
|
4. 应用实例
OpenNJet Sidecar 应用v2传递原始目的地址
1.在K8s环境中,client通过域名访问一个服务(例如, http请求 “api.test.com:8080”), 把请求发往service对应的service_ip, 防火墙劫持该请求,重定向到本地监听15001 端口的sidecar进程处理。
2.egress sidecar 是一个4层代理,可以识别出http流量,并把http流量转发到本地的“egress policy”做进一步处理。
3.egress policy是个7层的代理server,它会挑选合适的后端真实的server地址,(此例中, server instance1, ip:10.0.30.1 或 instance2, ip:10.0.30.2). 假设选中server1后 ,它会连接 10.0.30.1:8080,并发送请求。
3.1 请求到10.0.30.1后, 入向的防火墙规则控制把请求都重定向到“ingress sidecar”,它也是一个4层代理 ,监听15006. 同时,防火墙把原始目的端口 (8080)记录在ip 包头(tcp option)里 。
4.ingress process 也必须挑选出http请求,转发给ingress policy,后者是一个7层代理,监听8086
5.ingress policy 在分析内容,并处理后,应该转发到原始的目的端口8080(阶段4.2), 由于ingress sidecar是个4层带来,不会修改http协议,因此,无法把8080这个信息传递给ingress policy。
Ingress sidecar在发送请求到 ingress policy时(步骤4.2),通过代理协议,在TCP连接的最开始传递该信息。ingress policy通过标准的NJet变量方式获取。
Ingress sidecar配置
stream {
server {
listen 15006 ;
njtmesh_dest on; #参考下面该指令的备注
proxy_protocol on; #开启protocol 功能
proxy_pp2 on; #开启protocol V2功能
proxy_pp2_set_tlv 0x41 $njtmesh_port; #设置tlv 字段名,以及值
proxy_pass 127.0.0.1:90;
}
}
Ingress policy的配置
http {
server {
listen 8086 proxy_protocol;
server_name server-90;
location /{
#todo: 其他的业务配置指令
proxy_pass 127.0.0.1:$proxy_protocol_tlv_0x41;
}
}
}
注:# njtmesh_dest NJet自定义指令,是用于获取firewall规则设置的原始目标信息的指令,开启后,可以通过$njtmesh_port 获取原始的目标端口,同样$njtmesh_ip,可以获得原始的目的地址。
5. 参考及致谢