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


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

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


前置条件

  • sshuttle(https://sshuttle.readthedocs.io/en/stable/overview.html
  • kubectl
  • ktctl
  • 本机具备访问k8s的能力

注: 对于内网的k8s集群可以通过拷贝kubernetes的config文件到本地并且修改server地址为 https://kubernetes:6443, 通过在hosts文件中增加config中master节点的外网地址达到访问内网k8s集群的目的 eg: xx.xx.xx.xx kubernetes


核心组件sshuttle | ssh


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

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


ssh端口转发介绍

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


  • 本地端口转发

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

格式:

<code>ssh -L localPort:remoteHost:remotePort/<code>

例:

<code>// 本地主机登录到目标主机,通过访问本地2000端口访问目标主机的3000端口服务
ssh -L 2000:localhost:3000 [email protected]/<code>


  • 远程端口转发

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

格式:

<code>ssh -R remotePort:targetHost:targetPort/<code>

例:

<code>// 本地登录到远程主机,通过访问远端2000端口访问本机的3000端口
ssh -R 2000:localhost:3000 [email protected]/<code>


  • 动态端口转发

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

格式:

<code>ssh -D localhost:localPort/<code>

例:

<code>// 本地主机登录到目标主机, 并进行动态端口 

转发ssh -D localhost:3000 [email protected]/<code>


KT Connect核心功能实现解析

KT Connect提供的几种服务都是通过在集群中部署shadow服务和本地的ktctl配合完成。其实可以理解shadow为Server,ktctl为Client,只要在这两个服务间建立起隧道即可解决本地与线上集群的网络问题。以下主机针对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地址即为shadow的endpoint 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 mesh在exchange的基础上做了扩展, 并不是直接替换原有应用, 而是增加版本做规则路由。

执行ktctl mesh tomcat --expose 8080

过程如下:

  1. 找出名为tomcat的deploy,基于该deploy标签进行复制,部署一个镜像为shadow的deploy。该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打破了网络限制实现了本地联调,真正解决了研发人员的痛点大大提高了研发效率,无疑为团队节约了大量的时间成本。


原文链接:https://mp.weixin.qq.com/s/X3pDjfFGJiEMWSk8El1ylA


关于睿云智合

深圳睿云智合科技有限公司成立于2012年,总部位于深圳,并分别在成都、深圳设立了研发中心,北京、上海设立了分支机构,核心骨干人员全部为来自金融、科技行业知名企业资深业务专家、技术专家。早期专注于为中国金融保险等大型企业提供创新技术、电子商务、CRM等领域专业咨询服务。

自2016年始,在率先将容器技术引进到中国保险行业客户后,公司组建了专业的容器技术产品研发和实施服务团队,旨在帮助中国金融行业客户将容器创新技术应用于企业信息技术支持业务发展的基础能力改善与提升,成为中国金融保险行业容器技术服务领导品牌。

此外,凭借多年来在呼叫中心领域的业务经验与技术积累,睿云智合率先在业界推出基于开源软交换平台FreeSwitch的微服务架构多媒体数字化业务平台,将语音、视频、webchat、微信、微博等多种客户接触渠道集成,实现客户统一接入、精准识别、智能路由的CRM策略,并以容器化治理来支持平台的全应用生命周期管理,显著提升了数字化业务处理的灵活、高效、弹性、稳定等特性,为帮助传统企业向“以客户为中心”的数字化业务转型提供完美的一站式整体解决方案。


分享到:


相關文章: