1. 引言

kt-connect是阿里开源的k8s的调试工具,它的作用类似于VPN,能够打通k8s集群和本地的网络。

传送门: alibaba/kt-connect

它有3种模式
* Connect 本地网络直接访问k8s集群网络
* Exchange 转发集群流量到本地
* Service Mesh 支持

另外它提供了一个Dashboard可以查看k8s集群内的所有可访问的service资源以及正在进行调试的ConnectExchange数量, 用处不大。

2. 使用介绍

这里萌叔只简单介绍ConnectExchange2种模式,更详细的使用说明见参考资料1

2.1 Connect模式

sudo ktctl -i ik8share/kt-connect-shadow:stable connect

注意: kt-connect 依赖sshuttle, 且运行时必须拥有root权限。另外sshuttle 又依赖了iptables(linux操作系统), ptctl(macOS)

-i 参数指定镜像的地址

这里ik8share/kt-connect-shadow:stable是镜像的名字,阿里默认提供的镜像地址rdc-incubator/kt-connect-shadow在萌叔的测试k8s集群中无法正常拉取。这里提供了一个docker hub的镜像地址。

2.2 Exchange模式

sudo ktctl -n test -i ik8share/kt-connect-shadow:stable exchange dm-backend-v0-0-1 --expose 3000

注意: 这里的dm-backend-v0-0-1 是k8s集群中Deployment资源的名称。

该命令会将所有发往dm-backend-v0-0-1所属Pod的3000端口的请求都转发到本地的3000端口上。

总结:ConnectExchange 模式都是单向的,一个是从集群外部到集群内部,一个是从集群内部到集群外部。

3. 原理和实现

kt-connect设计巧妙,且最大限度的避免了重复发明轮子,值得称赞。

3.1 Connect模式

我们先来看看Connect模式要达到的目标
假定
Namespace: test
Service: sv-backend-v0-0-1
Pod的IP: 172.20.1.29

curl http://sv-backend-v0-0-1.test.svc.cluster.local/info
curl 172.20.1.29:3000/info

那么显然,
对于场景1: kt-connect需要知道sv-backend-v0-0-1.test.svc.cluster.local是k8s集群内的域名,针对此类域名的请求,需要转发到k8s内网

对于场景1: kt-connect 需要知道 172.20.1.29,是k8s集群的内网IP,请求需要转发到k8s内网

kt-connect 需要能够自动捕获这两类流量,然后转发到k8s内网。

3.1.1 ① 创建Pod

此Pod镜像为rdc-incubator/kt-connect-shadow,并且暴露SSH端口

3.1.2 ② 在Local和K8s之间建立通道

kubectl -n default port-forward kt-connect-daemon-dnwvy-5dbf9cb9c6-l96g6 2222:22

3.1.3 ③ 捕获请求,并重新路由

sshuttle --dns --to-ns 172.20.3.25 -v -e ssh -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -r root@127.0.0.1:2222 -x 127.0.0.1 172.20.0.0/24 172.20.2.0/24 172.20.1.0/24 172.20.3.0/24 10.68.0.0/16

sshuttle内部会调用iptablespfctl修改NAT规则

–dns –to-ns 172.20.3.25表示DNS解析使用172.20.3.25,实时上这个IP就是Pod kt-connect-daemon-dnwvy-5dbf9cb9c6-l96g6的IP

规则形如

iptables -t nat -A sshuttle-12300 -j REDIRECT --dest 10.68.0.0/16  -p tcp --to-ports 2222

3.1.4 ④ sshuttle重建对目标的连接

我们再来梳理一遍流程。当使用curl请求接口时,域名解析会使用自定义的DNS服务器172.20.3.25,因此能够成功解析sv-backend-v0-0-1.test.svc.cluster.local,解析得到的A记录是10.68.54.179, 显然命中了shuttle创建的NAT规则(10.68.0.0/16),于是请求被转发到127.0.0.1:2222端口, 请求又经过port-forward转发到kt-connect-daemon-dnwvy-5dbf9cb9c6-l96g6的22端口。在这个Pod中,sshuttle重建对目标的连接,请求会被转发。

3.2 Exchange模式

3.2.1 ① 创建Pod & ② 删除原有Pod

实际上,kt-connect将原来的Deployment dm-backend-v0-0-1的replicas置为0,变相删除了Pod
创建了一个新的Deployment dm-backend-v0-0-1-kt-dfoje, 注意看它使用的镜像是kt-connect-shadow。由它创建的Pod,使用的Label和原先的一模一样,这样它就能欺骗k8s,使得对Service backend的请求都转发到它这里来。

3.2.2 ③在Local和K8s之间建立通道

kubectl -n test port-forward dm-backend-v0-0-1-kt-dfoje-7ff5d9564-kmklv 2226:22

访问本地的2226端口,相当于访问了dm-backend-v0-0-1-kt-dfoje-7ff5d9564-kmklv的22端口

3.2.3 ④ssh 远程转发

ssh -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -R 3000:127.0.0.1:3000 root@127.0.0.1 -p2226 sh loop.sh

ssh自带远程转发功能,它会在dm-backend-v0-0-1-kt-dfoje-7ff5d9564-kmklv中监听3000端口,然后把所有发到3000端口的请求转发到127.0.0.1:3000(见参考资料2)

我们再来梳理一遍流程。当其他服务访问Service backend时,由于

  labels:app: backend

只剩由kt-connect伪造的1个Pod dm-backend-v0-0-1-kt-dfoje-7ff5d9564-kmklv了,所以流量会被转发到这个Pod中。请求的3000端口的流量会被SSH的远程转发功能转发给本地的3000端口。

后记

2021年04月12日
如果启动kt-connect,控制台中提示

socat not found

port-forward启动失败,则需要在在k8s集群,以及运行kt-connect的机器上,都安装socat

yum install -y socat

参考资料

1.Kt Connect Docs
2.SSH的三种端口转发

聊聊k8s调试工具kt-connect的实现相关推荐

  1. Kt Connect 对windows的支持

    说一下 kt connect的特点 连接:直接访问远程Kubernetes集群.KT Connect sshuttle用作访问远程Kubernetes集群网络的vpn工具. 交换:开发人员可以交换工作 ...

  2. 详细聊聊k8s deployment的滚动更新(二)

    一.知识准备 ● 本文详细探索deployment在滚动更新时候的行为 ● 相关的参数介绍:   livenessProbe:存活性探测.判断pod是否已经停止   readinessProbe:就绪 ...

  3. K8S调试工具之--nsenter

    注:本文基于K8S v1.21.2版本编写 1.关于nsenter nsenter就是namespace enter的意思,它可以进入到目标程序所在的namespace中,因此可以用来调试容器程序.我 ...

  4. k8s调试工具--busybox

    busybox是一个很好的调试工具,可以测试k8s集群的很多问题.其中包含了很多常用的命令,比如:ping.wget.telnet等日常运维需要用到的一些常用工具.虽然不支持curl,但是是可以使用w ...

  5. k8s dial tcp connect: no route to host

    莫名其妙遇到-pod container 启动失败:Back-off restarting failed container StatefulSet zk 集群 pod 一直处于pending,pv ...

  6. java+connect+time+out_聊聊jdk httpclient的connect timeout异常

    序 本文主要研究一下httpclient的connect timeout异常 实例代码 @Test public void testConnectTimeout() throws IOExceptio ...

  7. k8s本地联调工具kt-connect

    1.Kt Connect简介 KT Connect ( Kubernetes Developer Tool ) 是轻量级的面向 Kubernetes 用户的开发测试环境治理辅助工具.其核心是通过建立本 ...

  8. KT Connnect 轻量级云原生测试环境治理工具

    简介 KT Connect ( Kubernetes Developer Tool ) 是轻量级的面向 Kubernetes 用户的开发测试环境治理辅助工具.其核心是通过建立本地到集群以及集群到本地的 ...

  9. 谈谈对K8S CNI、CRI和CSI插件的理解

    K8S的设计初衷就是支持可插拔架构,解决PaaS平台不好用.不能用.需要定制化等问题,K8S集成了插件.附加组件.服务和接口来扩展平台的核心功能.附加组件被定义为与环境的其他部分无缝集成的组件,提供类 ...

最新文章

  1. Gartner发布2020年数据与分析领域的十大技术趋势
  2. objective C socket 库
  3. 良好编程习惯的重要性
  4. 第四期直播分享预告-高薪offer指南
  5. 深入理解重要的编程模型
  6. 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
  7. BGP——路由抖动惩罚机制(讲解+配置)
  8. mysql8.0导入备份_mysql8.0.20配合binlog2sql的配置和简单备份恢复的步骤详解
  9. 【angularjs】【学习心得】ng-class总结
  10. 如何使用gcc编译器
  11. 2019美赛C题论文解读
  12. Win11桌面便签小工具下载 支持与手机同步的桌面便签工具下载
  13. Autojs.pro 7.0 - 免root 连点器
  14. Kafka+Spark Streaming+Redis实时计算整合实践
  15. 企鹅F4手机外观设计有突破 配MTK6592八核处理器
  16. 静态页面练习——京东商城登录页面
  17. 什么是RS-485?
  18. 关于 MyBatis动态sql,这里有 10 种超好用的写法
  19. frp服务端和客户端的配置和使用(超详细)
  20. 一阶低通滤波器-连续转离散

热门文章

  1. jqGrid 解决分页跳转无效问题
  2. 考研期间的避雷贴和你会头疼的方面
  3. 求教:怎样解决TencentTraveler(腾讯TT)引发的ViewStateException ?
  4. SQL题库:sqllearning3​—【未明学院】SQL课程作业
  5. 优化数据库查询速度的常见方法
  6. Win10系统下设置Go环境变量
  7. 远程控制之原理和实战
  8. 利用xgboost算法对液压系统的状态进行预测并分析影响因素重要性
  9. 大话理解TCP/IP
  10. 《大话设计模式》原型模式