聊聊k8s调试工具kt-connect的实现
1. 引言
kt-connect是阿里开源的k8s的调试工具,它的作用类似于VPN,能够打通k8s集群和本地的网络。
传送门: alibaba/kt-connect
它有3种模式
* Connect 本地网络直接访问k8s集群网络
* Exchange 转发集群流量到本地
* Service Mesh 支持
另外它提供了一个Dashboard可以查看k8s集群内的所有可访问的service资源以及正在进行调试的Connect
和Exchange
数量, 用处不大。
2. 使用介绍
这里萌叔只简单介绍Connect
和Exchange
2种模式,更详细的使用说明见参考资料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端口上。
总结:Connect
和Exchange
模式都是单向的,一个是从集群外部到集群内部,一个是从集群内部到集群外部。
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
内部会调用iptables
或pfctl
修改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的实现相关推荐
- Kt Connect 对windows的支持
说一下 kt connect的特点 连接:直接访问远程Kubernetes集群.KT Connect sshuttle用作访问远程Kubernetes集群网络的vpn工具. 交换:开发人员可以交换工作 ...
- 详细聊聊k8s deployment的滚动更新(二)
一.知识准备 ● 本文详细探索deployment在滚动更新时候的行为 ● 相关的参数介绍: livenessProbe:存活性探测.判断pod是否已经停止 readinessProbe:就绪 ...
- K8S调试工具之--nsenter
注:本文基于K8S v1.21.2版本编写 1.关于nsenter nsenter就是namespace enter的意思,它可以进入到目标程序所在的namespace中,因此可以用来调试容器程序.我 ...
- k8s调试工具--busybox
busybox是一个很好的调试工具,可以测试k8s集群的很多问题.其中包含了很多常用的命令,比如:ping.wget.telnet等日常运维需要用到的一些常用工具.虽然不支持curl,但是是可以使用w ...
- k8s dial tcp connect: no route to host
莫名其妙遇到-pod container 启动失败:Back-off restarting failed container StatefulSet zk 集群 pod 一直处于pending,pv ...
- java+connect+time+out_聊聊jdk httpclient的connect timeout异常
序 本文主要研究一下httpclient的connect timeout异常 实例代码 @Test public void testConnectTimeout() throws IOExceptio ...
- k8s本地联调工具kt-connect
1.Kt Connect简介 KT Connect ( Kubernetes Developer Tool ) 是轻量级的面向 Kubernetes 用户的开发测试环境治理辅助工具.其核心是通过建立本 ...
- KT Connnect 轻量级云原生测试环境治理工具
简介 KT Connect ( Kubernetes Developer Tool ) 是轻量级的面向 Kubernetes 用户的开发测试环境治理辅助工具.其核心是通过建立本地到集群以及集群到本地的 ...
- 谈谈对K8S CNI、CRI和CSI插件的理解
K8S的设计初衷就是支持可插拔架构,解决PaaS平台不好用.不能用.需要定制化等问题,K8S集成了插件.附加组件.服务和接口来扩展平台的核心功能.附加组件被定义为与环境的其他部分无缝集成的组件,提供类 ...
最新文章
- Gartner发布2020年数据与分析领域的十大技术趋势
- objective C socket 库
- 良好编程习惯的重要性
- 第四期直播分享预告-高薪offer指南
- 深入理解重要的编程模型
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- BGP——路由抖动惩罚机制(讲解+配置)
- mysql8.0导入备份_mysql8.0.20配合binlog2sql的配置和简单备份恢复的步骤详解
- 【angularjs】【学习心得】ng-class总结
- 如何使用gcc编译器
- 2019美赛C题论文解读
- Win11桌面便签小工具下载 支持与手机同步的桌面便签工具下载
- Autojs.pro 7.0 - 免root 连点器
- Kafka+Spark Streaming+Redis实时计算整合实践
- 企鹅F4手机外观设计有突破 配MTK6592八核处理器
- 静态页面练习——京东商城登录页面
- 什么是RS-485?
- 关于 MyBatis动态sql,这里有 10 种超好用的写法
- frp服务端和客户端的配置和使用(超详细)
- 一阶低通滤波器-连续转离散