一、目的

        云原生服务开发趋势将会越来越明朗,本地化开发,然后提交至k8s集群中运行的方式,在k8s集群中运行时出现的问题没有很好的办法复现、调试,只能凭借经验进行问题定位等,问题定位效率低下,从而对开发效率产生一定的影响。而搭建一套基于k8s的开发环境,一切基于k8s进行服务开发,可以随时debug,同时保证了开发环境和测试环境的一致性,方便问题定位。

        结合上述原因,因此有必要搭建一套基于k8s的开发环境。

二、基础环境准备

  1. docker、k8s环境(本人使用的是docker-desktop集成环境,安装了k8s )
  2. idea 开发工具
  3. kt-connect
  4. dapr
  5. java
  6. maven

三、服务预装

        dapr作为分布式应用运行时,存在于业务开发中,通过dapr实现业务服务的数据平面和控制平面分离。所以每个pod包含有两个重要容器(dapr和业务服务),dapr作为sidecar存在。

        结合dapr官方文档,在k8s环境中预先安装dapr环境(具体安装方法此处不详述)安装完成效果如下图:

        要结合k8s进行业务开发,k8s作为业务运行的独立环境, 此处的痛点是:如何将k8s中业务请求的流量劫持转发给本地的服务,从而实现服务的本地化开发与基于k8s的运行。所以需要深入理解k8s中网络的转发行为,在经过多种比较和探索后,选出了一款优秀的开源软件,用于实现k8s网络流量转发,kt-connect。

        使用kt-connect, 参考KT: A simple kubernetes development toolkit ,配置环境变量后,在cmd中可以使用ktctl命令

 

        结合kt-connect的实现机制,此处选用ktctl exchange 目标服务名 --mode scale --expose 8080 的模式,将k8s中目标服务的流量转发至本地的一个指定端口,从而实现本地与k8s的交付与debug。 

        若只是常规的服务调用,使用上述方式即可完成响应操作,但由于本人的微服务开发时基于dapr组件的, 所以每个service pod实际上包含两个container: dapr和服务, 在k8s中,每个pod的dapr组件默认使用固定端口3500,要通过dapr调用,需要基于pod将3500端口流量转发至本地服务对应dapr的端口(可自定义) 

四、示例

1.基础服务说明:

 

2.部署

首先将两个服务部署在k8s中,部署完成后可以通过kubectl get pods 查看,现在以xstest服务为例,先实现单个服务的流量可以劫持,并转发至本地,需要做如下操作:

启动本地xs-test服务

端口是8090

使用exchange将目标服务的流量转发至本地

ktctl  --withAnnotation="dapr.io/enabled=true,dapr.io/app-id=xstest,dapr.io/app-port=8090" exchange xstest --expose  8090 --mode scale

将exchange的pod的3500流量转发至本地3500

kubectl port-forward pod/xstest-exchange-xxx 3500:3500

调用测试

curl http://localhost:3500/v1.0/invoke/xstest/method/mytest

可以本地打断点,查看本地方法是否被调用

同理,启动xsdocker服务,xsdocker服务的dapr-port为3501

启动本地xs-docker服务

端口是8080,需要在idea中针对env配置本地dapr port为3501

 

使用exchange将目标服务的流量转发至本地

ktctl  --withAnnotation="dapr.io/enabled=true,dapr.io/app-id=xsdocker,dapr.io/app-port=8080" exchange xsdocker --expose  8080 --mode scale

将exchange的pod的3500流量转发至本地3500

kubectl port-forward pod/xsdocker-exchange-xxx 3501:3500

调用测试

curl http://localhost:3501/v1.0/invoke/xsdocker/method/test

 

可以本地打断点,查看本地方法是否被调用

服务调用

xsdocker中有一个方法可以调用xstest的mytest方法

curl http://localhost:3502/v1.0/invoke/xsdocker/method/daprtest

并可以看本地两个服务的控制台的打印日志,此处可以明显显示服务调用成功。

 

        通过上述配置,实现了k8s中服务的流量转发,dapr作为sidecar其端口在本地与k8s质检的转发操作行为等。上述示例实现了k8s开发环境中的服务调用和服务访问功能,同时明确了dapr-port的配置以及端口转发等行为。

附:多kubernetes集群环境,使用kubeconfig连接切换

kubeconfig配置如下:

1.将多个集群的config文件拷贝至$HOME/.kube文件夹下,并重命名

 

  注意事项, 若使用ks安装的k8s集群, 则需要将lb.kubesphere.local:6443 修改成外部可访问的地址, 比如本初config_staging环境, 则是192.168.100.3:6443

2.在.kube/路径下做如下脚本操作:

     export KUBECONFIG=$HOME/.kube/config:$(find $HOME/.kube -type f -maxdepth 1 | grep config | tr '\n' ':')

出现一个warning提示,可忽略

3.将所有kubeconfig文件合并

   kubectl config view --flatten > all-in-one-kubeconfig.yaml

4.验证是否有效
   kubectl config get-contexts --kubeconfig=$HOME/.kube/all-in-one-kubeconfig.yaml
 验证成功,则会出现两个集群信息列表

5. 将all-in-one-kubeconfig.yaml文件合并为config
  mv all-in-one-kubeconfig.yaml config 

6. 验证:
   kubectl config get-contexts 


7.集群切换
   kubectl config use-context kubernetes-admin@cluster.local


至此,kubeconfig可自由切换的操作完成,便于开发环境、测试环境的切换。 同时为本地开发提供了远程k8s集群访问的支撑。

 

 

 

 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐