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

Easter79
• 阅读 933

前言

一般来说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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k