KT Connect一款基于k8s的开发利器


  1. 前置条件
  2. 核心组件sshuttle | ssh
    1. ssh端口转发介绍
      1. 本地端口转发
      2. 远程端口转发
      3. 动态端口转发
    2. KT Connect核心功能实现解析
    3. connect
  3. exchange
  4. mesh
  5. run
    1. 总结

KT Connect作为一款开发环境治理的轻量级工具已经越来越受欢迎,官方文档非常详细请参考 https://alibaba.github.io/kt-connect/#/zh-cn 支持mac、linux、windows多种平台(windows由于诸多限制, 体验方面和其他平台相比略差)。经过最近一段时间的使用, 我想通过本篇文章对KT Connect的实现思路做一个梳理, 同时把这款好的工具安利给大家(有需求可以在githu上提issue,作者很勤快的)

前置条件

  • sshuttle
  • kubectl
  • ktctl
  • 本机具备访问k8s的能力

核心组件sshuttle | ssh

KT Connect基于sshuttle和ssh端口转发为开发者提供了强大的功能。

命令 功能 实现原理
connect 本地访问集群服务(pod ip, dns都支持) sshuttle(需要使用sudo权限)
exchange 集群访问本地服务 ssh远程端口转发
mesh ssh远程端口转发
run 将本地服务暴露到集群中(集群中的其他服务可以通过podIP, 或者svc访问本地服务) ssh远程端口转发

ssh端口转发介绍

ssh端口转发也称为ssh隧道,因为他们通过ssh登录以后在ssh的客户端和服务器端建立一个隧道,从而进行通信。ssh的数据转发是经过加密的, 因此通过ssh隧道建立连接交换数据是非常安全的。ssh的端口转发可以分为多种, 下面介绍下常用的三种

本地端口转发

将发送到本地端口的请求转发到目标主机端口, 从而达到访问目标主机端口的目的。

格式:

ssh -L localPort:remoteHost:remotePort

例:

1
2
// 本地主机登录到目标主机,通过访问本地2000端口访问目标主机的3000端口服务
ssh -L 2000:localhost:3000 root@xx.xx.xx.xx

远程端口转发

将发送到远端主机端口的请求转发到目标主机,这样可以通过访问远端端口来达到访问目标主机端口的目的。

格式:

ssh -R remotePort:targetHost:targetPort

例:

1
2
// 本地登录到远程主机,通过访问远端2000端口访问本机的3000端口
ssh -R 2000:localhost:3000 root@xx.xx.xx.xx

动态端口转发

针对本地端口转发和远程端口转发,都存在两个一一对应的端口,分别位于ssh的客户端和服务端,动态端口转发则只绑定一个本地端口,而targetHost:targetPort则是不固定的。targetHost:targetPort是由发起的请求决定的,比如,请求地址为192.168.1.12:3000,则通过ssh转发的请求地址也是192.168.1.12:3000

格式:

1
ssh -D localhost:localPort

例:

1
2
// 本地主机登录到目标主机, 并进行动态端口转发
ssh -D localhost:3000 root@xx.xx.xx.xx

KT Connect核心功能实现解析

KT Connect提供的几种服务都是通过在集群中部署shadow服务和本地的ktctl配合完成。其实可以理解shadowServer,ktctlClient,只要在这两个服务间建立起隧道即可解决本地与线上集群的网络问题。以下主机针对connect、exchange、mesh、run进行介绍。

connect

ktctl connect利用sshuttle为开发者提供了本地访问集群服务的能力, 支持ip地址和dns两种。

执行ktctl connect, 过程如下:

  1. 执行 ktctl connect, 部署shadow到k8s集群, 至于shadow部署到那个namespace使用什么镜像都可以自己指定。同时生成一个ssh的密钥对, 公钥挂载到shadow容器中。私钥保留在本地主机(后续使用sshuttle的时候需要用到私钥)
  2. 执行kubectl port-forward命令, 使shadow服务的端口映射到主机端口
  3. 执行sshuttle命令, 开启dns(dns地址即为shadowendpoint ip)和ssh选项。建立起远端和本地的ssh隧道

到此connect的所有流程已经走完了。你可以在本地访问集群中任意服务的ip:port或者dns:port

exchange

ktctl exchange将流量从本地引向集群, 也就是说可以在集群里面直接访问本地服务。有了这个功能直接省去了我们很多重复而且耗时的工作,比如打镜像,升级服务等等。使用如下:

  • 运行一个本地服务 docker run -itd -p 8080:80 nginx
  • 将本地服务暴露给集群ktctl exchange tomcat --expose 8080

过程如下:

  1. 将已经存在的目标服务tomcat缩容为0
  2. 重复connect步骤一,创建shadow服务并挂载公钥文件
  3. 执行kubectl port-forward命令, 使shadow服务的端口映射到主机端口
  4. 执行ssh的远程端口转发(ssh -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -i privateKey -R tomcatPort:127.0.0.1:localPort root@remoteHost -p remoteSSHPort),上述例子中相当于把tomcat的流量转发到本地指定端口。

此时在集群里面原有的应用就被本地服务给替换了,从而达到exchange的目的

mesh

ktctl meshexchange的基础上做了扩展, 并不是直接替换原有应用, 而是增加版本做规则路由。

执行ktctl mesh tomcat --expose 8080

过程如下:

  1. 找出名为tomcatdeploy,基于该deploy标签进行复制,部署一个镜像为shadowdeploy。该deploy会以tomcat-kt加一个五位随机字符命名。而这个随机字符串就是该deploy的版本号
  2. 执行kubectl port-forward命令, 使shadow服务的端口映射到主机端口
  3. 执行ssh的远程端口转发,把远程指定端口流量指向本地应用
  4. 此时万事具备, 只要修改istio路由规则就可以将满足条件的流量转向本地服务

    run

    ktctl run localservice --port 8080 --expose
    其实原理同exchange一样, 唯一的区别在于没有替换集群中的服务。而是在集群中新建了一个svc, 用户可以通过svc或者ip访问到本地服务。

通过上述示例, 相信大家对TK Connect功能和细节有了一个大致了解。另外KT Connect还提供了可视化(dashboard)查看当前服务状态, check检查当前环境依赖, 更详细的使用请参考官网说明

总结

传统的自动化流水线已经很大程度提高了我们的研发效率, 但是对于开发环境来讲, 我们可能做一行代码的调整同样要走完整个自动化流水线,无疑浪费了宝贵的时间。KT Connect打破了网络限制实现了本地联调,真正解决了研发人员的痛点大大提高了研发效率,无疑为团队节约了大量的时间成本。

page PV:  ・  site PV:  ・  site UV: