一、Spring Cloud Kubernetes 本地开发环境调试
上面文章使用 Spring Cloud Kubernetes
在 k8s
环境中实现了服务注册发现、服务动态配置,但是需要放在 k8s
环境中才能正常使用,在本地开发环境中可能没有 k8s
环境,如何本地开发调试呢?
这点 Spring Cloud
官方已经考虑到了这个问题,Spring Cloud Kubernetes
项目的代码依赖于 Fabric8 Kubernetes Java
客户端,这是一个流畅的 DSL
,可以使用协议与 K8s Server
进行 REST API
通信。
官方的介绍如下:
https://docs.spring.io/spring-cloud-kubernetes/reference/3.1-SNAPSHOT/kubernetes-awareness.html
整体本地开发环境构建的过程基本包括如下几步:
- 将
k8s master
节点的~/.kube/config
文件复制到本机电脑的用户目录下的.kube
目录中。 - 本地环境安装
kubectl
工具。 - 本地环境安装
KT-Connect
工具 - 使用
ktctl connect
连接k8s
环境。
二、将 k8s 的 config 复制到本机电脑
进入到已部署好的 k8s master
节点中:
shell
cd ~/.kube
ll
将 config
文件复制出来放到本机电脑的 C:\Users\{你的用户名}\.kube
目录下。
修改文件中的 clusters.cluster.server
为 k8s master
节点的 ip
,如果已经是,则不用修改:
三、部署 kubectl 工具
下载 kubectl
:
根据自己的环境下载后,配置环境变量,在 Path
中新增一个,指向 kubectl.exe
所在目录。
验证是否正常,打开 CMD
窗口,查看 kubectl
的版本:
shell
kubectl version --client --output=yaml
kubectl
会自动读取上面的 config
配置文件,所以此时可以直接查看 k8s
中的资源:
shell
kubectl get pods -n kube-system
四、部署 KT-Connect
KtConnect
是一款基于 k8s
环境用于提高本地测试联调效率的小工具。
功能包括:
Connect
:建立数据代理通道,实现本地服务直接访问k8s
集群内网(包括Pod IP
和Service
域名)Exchange
:让集群服务流量重定向到本地,实现快速验证本地版本和调试排查问题Mesh
:创建路由规则重定向特定流量,实现多人协作场景下互不影响的本地调试Preview
:暴露本地服务到集群,实现无需发布即可在线预览集成效果
下载 KT-Connect
,进入下面连接,根据自己电脑系统情况,下载相应软件包,这里我下载的 Windows x86 64位
:
https://github.com/alibaba/kt-connect/blob/master/docs/zh-cn/guide/downloads.md
下载后,解压可以看到 ktctl.exe
和 wintun.dll
。
配置环境变量,在 Path
中新增一个,指向这两个文件所在目录。
以管理员身份打开 CMD 窗口,查看版本,验证是否正常:
shell
ktctl -v
连接 K8s
,会自动在 k8s
中部署 kt-connect
服务。
shell
ktctl connect
注意该 CMD
窗口不要关闭,关闭后会自动停掉连接。
shell
kubectl get pods
五、本地环境调试
这里测试使用上篇文章实践的消费者服务,如果不清楚的可以在下面文章中找到搭建过程:
其中服务提供者需要已经部署到k8s
环境中:
本地 IDEA
启动服务消费者,启动时,指定环境变量 KUBERNETES_NAMESPACE
为 k8s
部署服务的命名空间,上篇文章中我们使用的 cloud
:
启动服务:
服务启动成功。
5.1 服务注册发现测试
调用 http://localhost:8080/discoveryInfo
查看服务信息:
已经能成功拿到 k8s
中的服务信息。
调用 http://localhost:8080/rpc
测试 RPC
远程调用,并且多次调用:
调用正常,并可以看到负载均衡效果。
5.2 服务动态配置测试
调用 http://localhost:8080/config
查看配置信息:
成功读取到 ConfigMap
中的配置信息。
尝试修改 K8s
中的配置文件:
shell
kubectl edit configmap consumerconfig -n cloud
可以在 IDEA
看到触发了 restart_context
策略:
再次查看配置信息:
也已经生效,可以感觉出来和在 k8s
中几乎一样使用。