前言
一般來說k8s使用的容器網絡與開發者的所在的辦公網絡並不能直接連通,如何在開發環境訪問k8s的服務,就成為我們日常開發繞不開的坎。下邊就介紹幾種可以方便我們在本地環境調用k8s服務方案
方案一:Telepresence
1、Telepresence簡介
Telepresence是一款為Kubernetes微服務框架提供快速本地化開發功能的開源軟件。它的工作原理是在本地和 Kubernetes 集群中搭建一個透明的雙向代理,它將集群中的數據卷、環境變量、網絡都代理到了本地。其官網如下
2、Telepresence能幫我們實現什么
- 本地服務可以完全訪問遠程群集中的其他服務;
- 本地服務可以完全訪問Kubernetes的環境變量,Secrets和ConfigMap;
- K8S中運行的遠程服務也可以完全訪問本地服務。
3、實踐步驟
a、安裝kubectl命令行工具,並配置本地可以訪問Kubernetes集群
b、安裝Telepresence工具
c、通過Telepresence工具啟動本地服務
ps: 因為Telepresence目前主要支持Mac和linux環境,對window雖然也支持,但用window的安裝方式,相比其他兩種繁瑣一些。而我的本地環境是window環境,因此我沒采用這種方式。如果對如何利用Telepresence訪問k8s感興趣的朋友可以查看如下鏈接
自從用上 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