作者:马铁强 职位:QA Lead
背景
在测试阶段有时候为了定位一个问题,需要在本地启动服务,接入到测试环境,去debug问题。由于本地和kubernetes不在同一个网,所以需要借助VPN工具,下面介绍一个开源的Kubernetes环境测试联调工具 kt-connect ,可以让本地服务接入k8s集群,接收来自集群其他服务的请求,并且kt-connect还可以过滤请求header,让本地服务只接收特定的请求,而其他请求还是由集群中的服务处理。
1、kt-connect提供的功能
kt-connect帮助实现了开发者本地运行的服务与Kubernetes集群中的服务之间的双向互通。主要包括下面几个功能:
1.1 connect
connect的作用是建立一个本地到集群的vpn,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,因此connect会在k8s集群中创建一个shadow pod,用来提供ssh和dns服务。当运行connect命令时会为集群service建立临时dns配置。当ktctl connect命令退出时自动清理这些DNS配置,并销毁shadow pod。
1.2 exchange
kt-connect提供了两种方式重定向集群流量到本地服务,exchange用shadow pod作为代理,将集群指定服务的所有流量转向本地。
1.3 mesh
mesh和exchange一样,用Shadow Pod作为代理,根据路由规则重定向特定流量,实现多人协作场景下互不影响的本地调试。
1.4 preview
preview的作用是,为一个开发中的新服务提供接入集群预览和调试的能力,意味着此时集群中还没有这个服务,所以preview命令只是简单地创建shadow pod,并使用用户指定的名称创建shadow service,访问shadow service的请求被自然地路由到本地指定端口。
2、eureka的服务注册与发现
-
注册中心:是一个eureka server,提供服务注册和服务发现功能
-
生产者:是一个eureka client,它将自己提供的服务注册到注册中心,提供给消费者使用,注册时需要提供生产者的服务地址。
-
消费者:也是一个eureka client,是一个注册服务的使用者,从服务注册中心获取服务列表,通过服务注册的IP地址以及其它服务注册信息调用所需的服务。
3、举个例子
目标:拦截集群中 credit-center 的请求,转发到本地启动的credit-center服务debug。
我们需要做一些准备工作:
3.1 为 credit-center 创建一个对应的Service资源
因为kt-connect是通过kubernetes的Service资源把请求重定向到本地服务,所以这个被debug的 credit-center 必须有一个Service资源。所以我们先在k8s测试环境创建一个名为guardian-credit-center-service的service。
3.2 用 credit-center ServiceIP注册eureka
由于当前架构基于eureka作为注册中心,服务之间调用通过服务在eureka中注册的IP地址相互发送请求的。所以要保证部署到k8s集群的credit-center服务是用serviceIP注册的eureka,在credit-center的bootstrap.yaml文件中需要增加下面两项配置,指定注册到eureka的IP地址为上面创建的service名。如果不加这两个配置,这个credit-center服务默认使用容器的pod IP注册eureka。
3.3 准备kubeconfig文件
kt-connet需要一个kubeconfig文件提供集群身份认证信息,所以要先准备一个k8s测试环境的kubeconfig文件,用于kt-connect与kubernetes集群建立连接,如果你用的是阿里云可以在集群控制台找到它,否则可以自己创建,此处不介绍创建kubeconfig文件过程了。
kubeconfig文件大概是这样的:
3.4 kt-connect连接集群
在启动本地服务之前首先要通过ktctl connect命令连接到k8s集群。使用ktctl connect命令时需要注意该命令需要管理员权限,并指定kubeconfig文件和命名空间。
现在本地已经能够直接访问集群资源了,可通过浏览器或telnet命令来验证。
3.5 启动本地服务
启动本地服务之前,eureka.client.service-url.defaultZone配置k8s集群eureka的servicename。
3.6 转发集群所有流量
用exchange命令将集群里访问credit-center服务的所有请求拦截并转发到本地的指定端口。
3.7 转发集群部分流量
如果只是想特定的请求交给本地的debug服务处理,可以使用mesh命令,开启mesh模式时会生成一个header,发送测试请求时带上这个header就可以被转发到本地服务,实现多人协作场景下互不影响的本地调试。
4、结语
其他类似的工具还有telepresence,两者的提供的核心能力类似,但telepresence不是完全开源,有部分功能需要付费使用。而kt-connect完全免费,可以随时让本地服务接入kubernetes测试集群进行断点debug,并且还能拦截特定请求、不受其他请求干扰。