背景

在某些时候,研发会提出直连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为例 85aee96caae6422aa1b1315c7ae4893d.png f28676c372844bd6be95172036f9e252.png

  • 配置service,协议需要修改为tcp,并关联上一步配置好的upstream 2681bb70dcc14cf9a4d0edf1acb4c366.png

  • 配置route 协议同样需要调整为TCP,同时需要设置SNIs、Sources、Destinations三者中的任意一个,这里我们选择设置Sources(即访问的源IP地址) e1ae170116e74fef98b140897d1bcc3b.png 9d9b1030646944dca277d2f3c4f1f09f.png

  • 测试 a981179c56c14c55a9b89684d868e524.png