k8s本地联调工具——kt-connect

k8s本地联调工具——kt-connect

开发者痛点

在微服务开发的工作中,开发者常常会遇见这样一个问题:

本地开发了一个接口新功能或者需要对某个接口进行bug调试,一般的做法就是本地起服务,然后用postman等工具去构造请求进行测试。但是有时候微服务会依赖其他服务,服务之间用feign等方法调用,导致接口测试不通,死办法可以把k8s上被依赖的服务开放几个公网端口,通过修改feign的url进行调用,或者把被依赖的服务也在本地启动,完全本地测试。

这两种方法在简单的微服务调用情况下不失为一种方式,但是如果服务A→B,而且B→C,C→D…采用之前的死办法会让本地起的服务越来越多,同时每个服务一般都有dev、staging、prod等环境,不同环境配置也不一样,稍不留神就会出错。我们下意识的就会希望有一种方式可以把打到k8s上的请求转到本地,这样就可以非常方便的进行接口测试或者debug了,kt-connect就能很好的满足这个需求。

Kt-connect简介

KT Connect ( Kubernetes Developer Tool ) 是轻量级的面向 Kubernetes 用户的开发测试环境治理辅助工具。其核心是通过建立本地到集群以及集群到本地的双向通道,从而提升在持续交付生命周期中开发环节的效率问题以及开发测试环境的复用问题。

k8s结构图

Kt-connect能帮我们实现什么

  1. 直接访问Kubernetes集群

    开发者通过KT可以直接连接Kubernetes集群内部网络,在不修改代码的情况下完成本地开发与联调测试

  2. 转发集群流量到本地

    开发者可以将集群中的流量转发到本地,从而使得集群中的其它服务可以联调本地

  3. Service Mesh支持

    对于使用Istio的开发者,KT支持创建一个指向本地的Version版本

  4. 基于SSH的轻量级VPN网络

    KT使用shhuttle作为网络连接实现,实现轻量级的SSH VPN网络

  5. 作为kubectl插件,集成到Kubectl

    开发者也可以直接将ktctl集成到kubectl中

安装

Macos

推荐使用**Homebrew**工具一键安装:

1
brew install kt-connect

也可以手工下载最新软件包:

通过命令行下载并安装KT(以x86 64位版本为例)

1
2
3
4
$ curl -OL https://github.com/alibaba/kt-connect/releases/download/v0.3.7/ktctl_0.3.7_MacOS_x86_64.tar.gz
$ tar zxf ktctl_0.3.7_MacOS_x86_64.tar.gz
$ mv ktctl /usr/local/bin/ktctl
$ ktctl --version

可以从Github Releases下载历史版本的软件包

Linux

最新软件包:

下载并安装KT(以x86 64位版本为例)

1
2
3
4
$ curl -OL https://github.com/alibaba/kt-connect/releases/download/v0.3.7/ktctl_0.3.7_Linux_x86_64.tar.gz
$ tar zxf ktctl_0.3.7_Linux_x86_64.tar.gz
$ mv ktctl /usr/local/bin/ktctl
$ ktctl --version

可以从Github Releases下载历史版本的软件包

Windows

最新软件包:

下载并解压,将包中的wintun.dll和可执行文件ktctl.exe一起放到PATH环境变量指定的任意位置。

可以从Github Releases下载历史版本的软件包

常见操作

kt-connect会在指定连接的命名空间(namespace)里面新建一个自用的pod,然后部署一个kt-connect-shadow的镜像:

  • Connect:建立数据代理通道,实现本地服务直接访问Kubernetes集群内网(包括Pod IP和Service域名)
  • Exchange:让集群服务流量重定向到本地,实现快速验证本地版本和调试排查问题
  • Mesh:创建路由规则重定向特定流量,实现多人协作场景下互不影响的本地调试
  • Preview:暴露本地服务到集群,实现无需发布即可在线预览集成效果

Connect

ktctl connect可以将本地环境连接至k8s集群,看到All looks good, now you can access to resources in the kubernetes cluster表示连接成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ sudo ktctl connect --namespace test

5:31PM INF Using cluster context kubernetes-admin@kubernetes (kubernetes)
5:31PM INF KtConnect 0.3.6 start at 91483 (darwin amd64)
5:31PM INF Fetching cluster time ...
5:31PM INF Using tun2socks mode
5:31PM INF Successful create config map kt-connect-shadow-jhqrg
5:31PM INF Deploying shadow pod kt-connect-shadow-jhqrg in namespace test
......
5:31PM INF Setup local DNS with upstream [tcp:127.0.0.1:20626 udp:192.168.9.200:53]
5:31PM INF Creating udp dns on port 10053
5:31PM INF ---------------------------------------------------------------
5:31PM INF All looks good, now you can access to resources in the kubernetes cluster
5:31PM INF ---------------------------------------------------------------

#这里名称空间我选择的test,因为我测试服务起在这个名称空间下

Exchange

exchange

当看到Now all request to service '{your_service_in_k8s}' will be redirected to local 的时候说明k8s的请求都被转到本地

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ktctl exchange -n {your_namespace_in_k8s} {your_service_in_k8s} --expose {your_local_service_port_in_k8s}:{your_service_target_port_in_k8s}

12:39PM INF Using cluster context {k8s_cluster_context} ({k8s_cluster_context})
12:39PM INF KtConnect 0.3.6 start at 28585 (linux amd64)
12:39PM INF Fetching cluster time ...
12:39PM INF Using selector mode
12:39PM INF Service {your_service_in_k8s} locked
12:39PM INF Successful create config map {your_service_in_k8s}-kt-exchange-zikkt
12:39PM INF Deploying shadow pod aide-be-service-kt-exchange-zikkt in namespace {your_namespace_in_k8s}
12:39PM INF Waiting for pod {your_service_in_k8s}-kt-exchange-zikkt ...
12:39PM INF Pod {your_service_in_k8s}-kt-exchange-zikkt is ready
12:39PM INF Forwarding pod {your_service_in_k8s}-kt-exchange-zikkt to local via port {your_local_service_port_in_k8s}}:{your_service_target_port_in_k8s}
12:39PM INF Port forward local:41512 -> pod {your_service_in_k8s}-kt-exchange-zikkt:22 established
12:39PM INF Reverse tunnel 0.0.0.0:{your_local_service_port_in_k8s}} -> 127.0.0.1:{your_service_target_port_in_k8s} established
12:39PM INF Service aide-be-service unlocked
12:39PM INF ---------------------------------------------------------------
12:39PM INF Now all request to service '{your_service_in_k8s}' will be redirected to local
12:39PM INF ---------------------------------------------------------------
^C12:39PM INF Terminal Signal is interrupt
12:39PM INF Removed pid file /home/PJLAB/leidaoyu/.kt/pid/exchange-28585.pid
12:39PM INF Removed key file /home/PJLAB/leidaoyu/.kt/key/aide-be-service-kt-exchange-zikkt.key
12:39PM INF Pid file was removed
12:39PM INF Original service aide-be-service recovered
12:39PM INF Cleaning configmap aide-be-service-kt-exchange-zikkt
12:39PM INF Cleaning shadow pod aide-be-service-kt-exchange-zikkt

Mesh

mesh

当看到Now you can access your service by header 'VERSION: jnuie' 的时候说明k8s的请求都被转到本地,在向k8s发请求的时候在header里面加入VERSION: jnuie 参数,请求就会被转发回本地

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
ktctl exchange -n {your_namespace_in_k8s} {your_service_in_k8s} --expose {your_local_service_port_in_k8s}:{your_service_target_port_in_k8s}
1:21PM INF Using cluster context {k8s_cluster_context} ({k8s_cluster_context})
1:21PM INF KtConnect 0.3.6 start at 2965 (linux amd64)
1:21PM INF Fetching cluster time ...
1:21PM INF Using auto mode
1:21PM INF Service {your_service_in_k8s}e locked
1:21PM INF Service {your_service_in_k8s}e-kt-stuntman created
1:21PM INF Service {your_service_in_k8s}-kt-mesh-jnuie created
1:21PM INF Router pod {your_service_in_k8s}-kt-router created
1:21PM INF Waiting for pod {your_service_in_k8s}-kt-router ...
1:21PM INF Pod {your_service_in_k8s}-kt-router is ready
1:21PM INF Router pod is ready
1:21PM INF Router pod configuration done
1:21PM INF Successful create config map {your_service_in_k8s}-kt-mesh-jnuie
1:21PM INF Deploying shadow pod {your_service_in_k8s}-kt-mesh-jnuie in namespace {your_namespace_in_k8s}
1:21PM INF Waiting for pod {your_service_in_k8s}-kt-mesh-jnuie ...
1:21PM INF Pod {your_service_in_k8s}-kt-mesh-jnuie is ready
1:21PM INF Forwarding pod {your_service_in_k8s}-kt-mesh-jnuie to local via port {your_local_service_port_in_k8s}:{your_service_target_port_in_k8s}
1:21PM INF Port forward local:54156 -> pod aide-be-service-kt-mesh-jnuie:22 established
1:21PM INF Reverse tunnel 0.0.0.0:{your_local_service_port_in_k8s} -> 127.0.0.1:{your_service_target_port_in_k8s} established
1:21PM INF ---------------------------------------------------------------
1:21PM INF Now you can access your service by header 'VERSION: jnuie'
1:21PM INF ---------------------------------------------------------------
1:21PM INF Service aide-be-service unlocked

nacos服务发现注意事项

如果微服务的负载均衡是通过第三方组件完成的,如nacos的服务发现,则feign配置需要修改,url需要设置成k8s的ingress上的地址

ingress


k8s本地联调工具——kt-connect
https://shouldbeldy.github.io/2023/02/21/k8s本地联调工具——kt-connect/
作者
Daoyu Lei
发布于
2023年2月21日
许可协议