全栈工程师开发手册 (作者:栾鹏)
架构系列文章


官方github:https://github.com/alibaba/kt-connect

本地linux安装

# 切换到root用户
sudo su
# pip install sshuttle
# curl -OL https://rdc-incubators.oss-cn-beijing.aliyuncs.com/stable/ktctl_linux_amd64.tar.gz
# tar -xzvf ktctl_linux_amd64.tar.gz
# mv ktctl_linux_amd64 /usr/local/bin/ktctl
# ktctl -h

这种安装的可能不是最新版,也可以离线下载.下载地址:

​https://github.com/alibaba/kt-connect/releases/​

在Kubernetes中部署联调服务

kubectl run tomcat --image=tomcat:7 --expose --port=8080
会自动创建deployments和service

Connect 从本地访问Kubernetes资源

本地执行

root用户执行
# ktctl --kubeconfig /home/luanpeng/.kube/config --debug connect

如果提示已经运行,则可以在k8s中把deployment删除,在客户端把​​/home/luanpeng/.ktctl/​​​文件夹删除.
访问PodIP:

运行成功后可以查看是否成功启动sshuttle

ps -ef |grep sshuttle

如果sshuttle两个进程没有启动,则说明启动失败

/usr/bin/python3 /usr/local/bin/sshuttle --dns --to-ns 10.42.0.58 -e ssh -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -i /root/.kt_id_rsa -r 

/usr/bin/python3 /usr/local/bin/sshuttle --method auto --firewall

在这种场景下,开发者只要直接使用ktctl connect打通本地到集群的网络即可,就可以直接在本地通过PodIP/ClusterIP/DNS地址访问集群中的服务。

kubernets 集群和本地环境联调环境打通工具kt-connect_k8s

curl http://172.16.0.147:8080

访问ClusterIP:

$ curl http://172.19.143.139:8080

Access Server内部DNS地址(未测试成功, 提示Could not resolve host)

# 先看是否能正常解析
nslookup tomcat.default.svc.cluster.local
# 试一下http请求
$ curl http://tomcat.default.svc.cluster.local:8080

Exchange从群集访问本地

在本地创建Tomcat 8并公开8080端口

docker run -itd -p 8080:8080 tomcat:8
$ ktctl exchange tomcat --expose 8080

暴露本地服务到k8s中

$ ktctl exchange tomcat --expose 8080

在k8spod中通过内部服务DNS地址访问本地tomcat:

注意:如果kubectl connect未运行,则只能从群集访问

$ curl http://tomcat.default.svc.cluster.local:8080 | grep '<h1>'

在这个场景下,我们希望集群中所有对服务C的访问能够请求到本地正在开发的C’。因此开发者可以通过ktctl exhcnage命令,在集群内部署一个Shadow容器已接管所有原本对C实例的请求,再通过Shadow容器将请求转发到本地。并在退出命令式恢复集群中C的实例状态。

kubernets 集群和本地环境联调环境打通工具kt-connect_kubernetes_02

​https://mp.weixin.qq.com/s?__biz=MzA5OTAyNzQ2OA==&mid=2649703426&idx=1&sn=22be252aac597745cf832df987b324cf&chksm=88937b61bfe4f277d4744f2205a4f1fbdc7ff928e386c5aa728d8e0baccb202f44ef502a78a9&mpshare=1&scene=1&srcid=&sharer_sharetime=1572233974491&sharer_shareid=13fe4d560ad7f178a70a6b90efad8011#rd​

Mesh

mesh与exchange的最大区别在于,exchange会完全替换原有的应用实例。mesh命令创建代理容器,但是会保留原应用容器,代理容器会动态生成version标签,以便用于可以通过Istio流量规则将特定的流量转发到本地,同时保证环境正常链路始终可用。在这种场景下,在确保开发测试环境稳定的同时,基于Istio的流量规则,我们可以把部分流量转到本地,从而实现在共享的开发测试环境中的联调能力。

kubernets 集群和本地环境联调环境打通工具kt-connect_kubernetes_03

仪表盘部署

参考:https://alibaba.github.io/kt-connect/#/guide/dashboard