k8s集群中的springcloud架构如何丝滑的断点调试

作者:Sample HubSpot User | Nov 2, 2023 3:02:07 AM

作者:马铁强  职位: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的服务注册与发现

  1. 注册中心:是一个eureka server,提供服务注册和服务发现功能

  2. 生产者:是一个eureka client,它将自己提供的服务注册到注册中心,提供给消费者使用,注册时需要提供生产者的服务地址。

  3. 消费者:也是一个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,并且还能拦截特定请求、不受其他请求干扰。