背景
在某些时候,研发会提出直连pod网段进行debug或者数据台账处理的需求; 正常情况下,通过网络拨号可以访问到华为云北京一的容器网段,但由于华为云北京一和华为云北京四的网段是相同的,拨号服务端部署在北京一环境,因此无法直接访问到华为云北京四的容器网段; 这个时候,我们可以转换一下思路,通过nginx或者api网关将pod的tcp端口暴露出来,让需求方通过公网进行访问。
Nginx传统解决方案
# cat /usr/local/nginx/conf/jgroups.conf
stream {
server {
listen 12001;
proxy_pass 172.36.111.204:12001;
}
server {
listen 12002;
proxy_pass 172.36.109.137:12001;
}
}
- 要求nginx需要开启stream模块,编译的时候加载 --with-stream 选项 通过nginx来转发虽然可以实现请求的转发,但由于pod的ip不是固定的,除非将nginx也部署进k8s,否则IP一旦出现变化就需要运维介入调整。 我们已经在k8s里面部署了api网关kong,因此希望可以通过kong来实现类似的需求
Kong解决方案
- 首先需要开启stream功能,默认不开启 调整kong.conf配置文件后重启kong
# grep 'stream' /etc/kong/kong.conf |grep -v '#'
stream_listen = 0.0.0.0:7000
-
配置upstream后端,此次为方便测试,以mysql为例
-
配置service,协议需要修改为tcp,并关联上一步配置好的upstream
-
配置route 协议同样需要调整为TCP,同时需要设置SNIs、Sources、Destinations三者中的任意一个,这里我们选择设置Sources(即访问的源IP地址)
-
测试