如何暴露多个容器端口至本地调试

越来越多的业务在容器中运行,而容器环境和本地环境默认是隔离的,网络不通,调试代码时,很不太方便,此时想到的方案是能不能把容器端口暴露至本地(对于不需要调试代码的大神另当别论),想到了 Kubernetes 中的 kubectl port-forward 方法可以将pod/svc的端口暴露至本地。现情况是本地调试代码时,需要连接多个容器,每次port-forward都需要占用一个终端,需要打开多个终端及有的时候会断开,很不方便调试,鉴于此,能不能在一个终端下暴露多个端口及不会断开呢?本文介绍的socat能解决以上问题。

1 kubectl port-forward 端口暴露

  • 1.1 只能暴露一个容器端口,如下所示。
[root@bj-wlc-paas-10-255-238-179 ~]# kubectl port-forward --address 0.0.0.0  --namespace product-logmanage svc/sysmysql-b1d250de2f27-proxy 3331:3331
Forwarding from 0.0.0.0:3331 -> 3331
  • 1.2 port-forward底层也是通过socat方式运行的。
root@bj-wlc-paas-10-255-238-179 ~]# kubectl port-forward -h
Forward one or more local ports to a pod. This command requires the node to have 'socat' installed.

Use resource type/name such as deployment/mydeployment to select a pod. Resource type defaults to 'pod' if omitted.

If there are multiple pods matching the criteria, a pod will be selected automatically. The forwarding session ends
when the selected pod terminates, and rerun of the command is needed to resume forwarding.

2 socat 简介

socat 的主要特点就是在两个数据流之间建立通道,且支持众多协议和链接方式。如 IP、TCP、 UDP等。主要说明下本文使用到的参数及端口转发。

  • 2.1 基本语法socat [options] <address> <address>
  • 2.2 tcp端口转发socat -d -d -lf /var/log/socat.log TCP4-LISTEN:3331,bind=192.168.1.252,reuseaddr,fork TCP4:10.83.199.37:3331参数说明:
1. -d -d  前面两个连续的 -d -d 代表调试信息的输出级别。
2. -lf /var/log/socat.log 指定输出信息的文件保存位置。
3. TCP4-LISTEN:3331 在本地建立一个 TCP IPv4 协议的监听端口,也就是转发端口。这里是 3331,请根据实际情况改成你自己需要转发的端口。
4. bind 指定监听绑定的 IP 地址,不绑定的话将监听服务器上可用的全部 IP。
5. reuseaddr 绑定一个本地端口。
6. fork TCP4:10.83.199.37:3331 指的是要转发到的服务器 IP 和端口,这里是 10.83.199.37 的 3331 端口。

3 socat具体实践

  • 3.1 找到对应的服务ip及端口
[root@bj-wlc-paas-10-255-238-179 ~]# kubectl get svc -n product-logmanage | grep 3331                                  
sysmysql-b1d250de2f27-proxy ClusterIP 10.83.199.37 <none> 3331/TCP 12d
  • 3.2 socat命令的执行,其中&代表后台运行,用netstat检查服务的端口是否被监听
[root@bj-wlc-paas-10-255-238-179 ~]# socat TCP4-LISTEN:3331,reuseaddr,fork TCP4:10.83.199.37:3331 &
[1] 4099440
[root@bj-wlc-paas-10-255-238-179 ~]# netstat -anp | grep 3331
tcp 0 0 0.0.0.0:3331 0.0.0.0:* LISTEN 4099440/socat
  • 3.3 关掉服务端口暴露,kill -9 进程号,再用netstat检查服务是否还在

kill -9 4099440

4 多个容器端口暴露

需要多个容器端口暴露时,在脚本里面放多条socat指令即可,也可以在脚本里面添加netstat查看服务监听情况。

  • 4.1 实例脚本,其中包括四个容器服务需要暴露
[root@bj-wlc-paas-10-255-238-179 lin]# cat fo.sh
#!/bin/bash

socat TCP4-LISTEN:3331,reuseaddr,fork TCP4:10.83.199.37:3331 &
socat TCP4-LISTEN:39300,reuseaddr,fork TCP4:10.87.107.105:80 &
socat TCP4-LISTEN:9000,reuseaddr,fork TCP4:10.86.8.176:9000 &
socat TCP4-LISTEN:8081,reuseaddr,fork TCP4:10.94.117.171:8081 &
  • 4.2 检查服务是否正常监听
[root@bj-wlc-paas-10-255-238-179 lin]# netstat -anp | grep 3331
tcp 0 0 0.0.0.0:3331 0.0.0.0:* LISTEN 249267/socat
tcp 0 0 10.255.238.179:3331 10.32.118.250:61642 ESTABLISHED 4108395/socat
tcp 0 0 10.255.238.179:3331 10.32.118.250:61641 ESTABLISHED 4108323/socat
tcp 0 0 10.83.199.37:40148 10.83.199.37:3331 ESTABLISHED 4108323/socat
tcp 0 0 10.83.199.37:40164 10.83.199.37:3331 ESTABLISHED 4108395/socat
[root@bj-wlc-paas-10-255-238-179 lin]# netstat -anp | grep 39300
tcp 0 0 0.0.0.0:39300 0.0.0.0:* LISTEN 249268/socat
[root@bj-wlc-paas-10-255-238-179 lin]# netstat -anp | grep 9000
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 249269/socat
tcp 0 0 10.255.238.179:63082 10.150.158.140:9000 TIME_WAIT -
tcp 0 0 10.255.238.179:63564 10.150.158.140:9000 TIME_WAIT -
tcp 0 0 10.255.238.179:62830 10.150.158.140:9000 TIME_WAIT -
tcp 0 0 10.255.238.179:64050 10.150.158.140:9000 TIME_WAIT -
tcp 0 0 10.255.238.179:63326 10.150.158.140:9000 TIME_WAIT -
tcp 0 0 10.255.238.179:63792 10.150.158.140:9000 TIME_WAIT -
unix 3 [ ] STREAM CONNECTED 690002200 2408422/sshd: root
unix 3 [ ] STREAM CONNECTED 690002199 2408476/sshd: root@
[root@bj-wlc-paas-10-255-238-179 lin]# netstat -anp | grep 8081
tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN 249270/socat
  • 4.3 当不需要调试时,关掉对应的端口暴露
[root@bj-wlc-paas-10-255-238-179 lin]# kill -9 249270 249269 249268 249267
[root@bj-wlc-paas-10-255-238-179 lin]# netstat -anp | grep 8081
[root@bj-wlc-paas-10-255-238-179 lin]# netstat -anp | grep 9000
tcp 0 0 10.255.238.179:64520 10.150.158.140:9000 TIME_WAIT -
tcp 0 0 10.255.238.179:64760 10.150.158.140:9000 TIME_WAIT -
tcp 0 0 10.255.238.179:33476 10.150.158.140:9000 TIME_WAIT -
tcp 0 0 10.255.238.179:33260 10.150.158.140:9000 TIME_WAIT -
tcp 0 0 10.255.238.179:33006 10.150.158.140:9000 TIME_WAIT -
tcp 0 0 10.255.238.179:32782 10.150.158.140:9000 TIME_WAIT -
unix 3 [ ] STREAM CONNECTED 690002200 2408422/sshd: root
unix 3 [ ] STREAM CONNECTED 690002199 2408476/sshd: root@
[root@bj-wlc-paas-10-255-238-179 lin]# netstat -anp | grep 39300
[root@bj-wlc-paas-10-255-238-179 lin]# netstat -anp | grep 3331
tcp 0 0 10.255.238.179:3331 10.32.118.250:61642 ESTABLISHED 4108395/socat
tcp 0 0 10.255.238.179:3331 10.32.118.250:61641 ESTABLISHED 4108323/socat
tcp 0 0 10.83.199.37:40148 10.83.199.37:3331 ESTABLISHED 4108323/socat
tcp 0 0 10.83.199.37:40164 10.83.199.37:3331 ESTABLISHED 4108395/socat

5 结论

在本地调试,需要使用多个容器服务时,不单单使用 kubectl port-forward 还可以使用socat。


原文始发于微信公众号(云原生内经):如何暴露多个容器端口至本地调试

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/167927.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!