前言
一般来说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
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插件
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
另外一种我们也可以采用如下配置
通过设置-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