springcloud本地开发的微服务如何调用远程k8s的微服务

Easter79
• 阅读 510

前言

一般来说k8s使用的容器网络与开发者的所在的办公网络并不能直接连通,如何在开发环境访问k8s的服务,就成为我们日常开发绕不开的坎。下边就介绍几种可以方便我们在本地环境调用k8s服务方案

方案一:Telepresence

1、Telepresence简介

Telepresence是一款为Kubernetes微服务框架提供快速本地化开发功能的开源软件。它的工作原理是在本地和 Kubernetes 集群中搭建一个透明的双向代理,它将集群中的数据卷、环境变量、网络都代理到了本地。其官网如下

https://www.telepresence.io/

2、Telepresence能帮我们实现什么

  • 本地服务可以完全访问远程群集中的其他服务;
  • 本地服务可以完全访问Kubernetes的环境变量,Secrets和ConfigMap;
  • K8S中运行的远程服务也可以完全访问本地服务。

3、实践步骤

a安装kubectl命令行工具,并配置本地可以访问Kubernetes集群

b安装Telepresence工具

c通过Telepresence工具启动本地服务

ps: 因为Telepresence目前主要支持Mac和linux环境,对window虽然也支持,但用window的安装方式,相比其他两种繁琐一些。而我的本地环境是window环境,因此我没采用这种方式。如果对如何利用Telepresence访问k8s感兴趣的朋友可以查看如下链接

Telepresence:让微服务本地开发不再难

自从用上 Telepresence 后,本地调试 Kubernetes 中的微服务不再是梦!

方案二:Kt Connect

1、Kt Connect简介

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

https://alibaba.github.io/kt-connect/#/

2、Kt Connect能帮我们实现什么

a、直接访问Kubernetes集群

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

b、转发集群流量到本地

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

c、Service Mesh支持

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

d、基于SSH的轻量级VPN网络

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

e、作为kubectl插件,集成到Kubectl

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

3、实践步骤

a安装kubectl命令行工具,并配置本地可以访问Kubernetes集群

以在window环境安装kubectl命令行工具为例(ps:本文的k8s是直接使用云厂商的k8s服务)

3.1、 下载kubectl

请到kubernetes版本发布页面下载与集群版本对应的或者更新的kubectl。其下载链接如下

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/README.md

3.2、 安装kubectl后,配置一下环境变量 ,并用管理员cmd命令验证一下安装是否成功

C:\WINDOWS\system32>kubectl version --client
Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.9", GitCommit:"4fb7ed12476d57b8437ada90b4f93b17ffaeed99", GitTreeState:"clean", BuildDate:"2020-07-15T16:18:16Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"windows/amd64"}

3.2、 配置config文件

在C:\Users\Administrator目录下新建.kube文件夹,并在该文件夹下新建config文件,并把kubeconfig内容拷贝到config文件中。

3.3、 验证是否可以访问Kubernetes集群

C:\WINDOWS\system32>kubectl cluster-info
Kubernetes master is running at https://apiserver地址
CoreDNS is running at https:/apiserver地址/api/v1/namespaces/kube-system/services/coredns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

其详细的安装步骤可以查看如下文档

https://www.kubernetes.org.cn/installkubectl

如果是使用云厂商的k8s服务,比如是使用华为云cce,则可以根据如下文档进行安装

https://support.huaweicloud.com/usermanual-cce/cce_01_0107.html

如果是使用阿里云的k8s服务,则可以根据如下文档进行安装

https://help.aliyun.com/document_detail/86494.html

b、安装KT Connect

以在window安装为例,下载Windows可执行文件,并解压.exe文件到PATH路径下。其下载地址如下

https://alibaba.github.io/kt-connect/#/zh-cn/nightly

把下载的ktctl_windows_amd64.exe重命名为ktctl.exe

c、验证KT Connect是否安装成功

C:\WINDOWS\system32>ktctl -v
KT Connect version 0.0.10

d、通过KT Connect创建SOCKS5代理,其执行命令如下

ktctl --debug --image=registry.cn-hangzhou.aliyuncs.com/rdc-incubator/kt-connect-shadow:stable --namespace=dev connect --method=socks5

ps: 不指定镜像的话,默认就是

registry.cn-hangzhou.aliyuncs.com/rdc-incubator/kt-connect-shadow:stable

springcloud本地开发的微服务如何调用远程k8s的微服务

e、在idea如何进行联调

这边有两种方式,一种是在IDEA的工作目录下使用ktctl启动本地到集群的socks5代理服务:

ktctl --debug --image=registry.cn-hangzhou.aliyuncs.com/rdc-incubator/kt-connect-shadow:stable --namespace=dev connect --method=socks5

在运行完成后ktctl会自动在当前工作区生成.jvmrc文件,如下所示:

-DsocksProxyHost=127.0.0.1
-DsocksProxyPort=2223

IDEA使用.jvmrc自动设置Java启动参数,下载并安装最新版本的JVM Inject插件

springcloud本地开发的微服务如何调用远程k8s的微服务

JVM Inject插件会在Java程序启动时自动读取.jvmrc文件,并追加到程序的启动参数中,如下所示:

java ...省略的其他输出... -Djava.rmi.server.hostname=127.0.0.1 -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=2223 "-javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58609:/Applications/IntelliJ IDEA.app/Contents/bin" ...省略的其他输出...  sample.Application

另外一种我们也可以采用如下配置

springcloud本地开发的微服务如何调用远程k8s的微服务

通过设置-Dhttp.proxyHost和-Dhttp.proxyPort启动参数,在Java程序中所有网络请求完全通过KT Connect进行转发。从而可以直接在代码中访问Kubernetes集群中的服务。

f、验证

示例中xxl-job是部署在k8s集群内,当我们本地服务没有使用kt-connect代理,启动项目,则报了如下错

>>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='stock-service-executor', registryValue='http://192.168.1.2:9993/'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Can't connect to SOCKS proxy:Connection refused: connect), for url : http://dev-job-admin.dev.svc.cluster.local:8060/api/registry, content=null]

当开启代理后,控制台输出如下内容

 >>>>>>>>>>> xxl-job register jobhandler success, name:shardingJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@35f35c59[class com.linyb.stock.handler.SampleXxlJob#shardingJobHandler]

说明我们本地服务已经成功访问k8s集群中的服务

其他方案

通过vpn或者类似iptable工具来进行转发

总结

以上的方案,我在实际落地时,是选用kt-connect,感兴趣的朋友可以尝试一下。其实在开发环境时,也可以直接使用docker-compose来进行服务编排,复杂度也不是那么高

参考文档

https://www.telepresence.io/

https://alibaba.github.io/kt-connect/#/

https://www.kubernetes.org.cn/

https://www.v2ex.com/t/584314

点赞
收藏
评论区
推荐文章
秃头王路飞 秃头王路飞
4个月前
webpack5手撸vue2脚手架
webpack5手撸vue相信工作个12年的小伙伴们在面试的时候多多少少怕被问到关于webpack方面的知识,本菜鸟最近闲来无事,就尝试了手撸了下vue2的脚手架,第一次发帖实在是没有经验,望海涵。languageJavaScript"name":"vuecliversion2","version":"1.0.0","desc
技术小男生 技术小男生
4个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
4个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
刚刚好 刚刚好
4个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
小森森 小森森
4个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
晴空闲云 晴空闲云
4个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
3个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
helloworld_34035044 helloworld_34035044
6个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
helloworld_28799839 helloworld_28799839
4个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue