0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何進(jìn)行本地調(diào)試

馬哥Linux運(yùn)維 ? 來源:馬哥Linux運(yùn)維 ? 作者:馬哥Linux運(yùn)維 ? 2022-09-20 16:46 ? 次閱讀

背景

注:背景有點(diǎn)啰嗦,講講一路走來研發(fā)本地調(diào)試的變化,嫌煩的可以直接跳過,不影響閱讀。

2019 年

我在的公司當(dāng)時(shí)是個(gè)什么情況,只有兩個(gè) Java 應(yīng)用,還都跑在一個(gè) Tomcat Servlet 容器。

37831a30-372a-11ed-ba43-dac502259ad0.png

當(dāng)時(shí)是如何本地調(diào)試?都是研發(fā)自己電腦裝個(gè) Mysql,裝個(gè) Tomcat,自己電腦運(yùn)行調(diào)試,好處嘛就是后端研發(fā)互不干擾,想怎么改就怎么改,APP 端研發(fā)就直連后端的筆記本調(diào)試。上線部署嘛就是一個(gè)研發(fā)手動(dòng)編譯個(gè) Jar 包丟到云服務(wù)器上面,大體就是個(gè)草臺班子,能干活,但是也就那樣。

2020 年

到了 2020 年,公司買了一臺服務(wù)器,Centos 的系統(tǒng),給裝上了 Mysql、Tomcat,用上了 Redis 緩存,RabbitMQ 消息隊(duì)列,有了獨(dú)立的測試環(huán)境,用上了 Jenkins 自動(dòng)打包并部署應(yīng)用,也算鳥槍換炮,起碼不用自己打包了。

379bf726-372a-11ed-ba43-dac502259ad0.png

這個(gè)時(shí)候是如何本地調(diào)試呢?起碼不用自己電腦裝 Mysql 了,后面框架由 SpringMVC 和 Struts2 都改成 Spring Boot,外置的 Tomcat 也可以去掉了。后端研發(fā)本地運(yùn)行 Spring Boot 時(shí)直連服務(wù)器的 Mysql 進(jìn)行調(diào)試,APP 端再也不用連后端研發(fā)的筆記本了,有了相對穩(wěn)定的調(diào)試環(huán)境。代價(jià)就是各個(gè)后端的數(shù)據(jù)庫更新結(jié)構(gòu)要保持兼容性,避免影響他人。

2021 年

隨著業(yè)務(wù)增長,后端框架由 Spring Boot 進(jìn)化為 Spring Cloud 全家桶,應(yīng)用運(yùn)行環(huán)境由 Linux 直接運(yùn)行改為了 Docker 鏡像部署,各類中間件同樣也使用了 Docker 鏡像。產(chǎn)品線增加,單一的開發(fā)分支已經(jīng)不能滿足需求,為此又開辟了另外一條后端代碼分支,同樣的開發(fā)測試環(huán)境也多了一份。

37ad7c3a-372a-11ed-ba43-dac502259ad0.png

這個(gè)時(shí)候的本地調(diào)試,對于 APP 端來說變化不大,區(qū)別連接后端不同環(huán)境使用不同域名而已。對于后端的研發(fā)同學(xué)就不一樣了,每次本地調(diào)試自己電腦要常駐一個(gè) Eureka 和一個(gè) Config Server,如果本地調(diào)試的微服務(wù)依賴比較多,沒個(gè)大內(nèi)存真是頂不住。

2022 年

業(yè)務(wù)量繼續(xù)增加,產(chǎn)品同事數(shù)量增加了,那個(gè)需求量真是堆積如山,兩個(gè)分支已經(jīng)不能滿足要求了,又開了第三個(gè)分支,還是不夠。每次增加新的分支運(yùn)行環(huán)境,后端研發(fā)同學(xué)也很痛苦,一堆環(huán)境和第三方平臺回調(diào)需要配置。為了能動(dòng)態(tài)擴(kuò)容縮容,Spring Cloud 全家桶繼續(xù)演進(jìn),拋棄了 Zuul 網(wǎng)關(guān)和 Eureka,改為使用 Spring Cloud Kubernetes,運(yùn)行環(huán)境全面向 K8S 靠攏。在此期間公司又采購了一臺服務(wù)器用于開發(fā)測試,內(nèi)存 CPU 磁盤滿上!

37b9ceea-372a-11ed-ba43-dac502259ad0.png

進(jìn)入 K8S 時(shí)代,后端研發(fā)本地的電腦沒辦法隨意連接 Linux 服務(wù)器上面的各種中間件,每個(gè)新分支環(huán)境里面的每個(gè) POD 都是一個(gè)新的 ip,也不可能像之前那樣開放指定幾個(gè)中間件的端口給后端連接,那么多環(huán)境每個(gè)都做設(shè)置的話,運(yùn)維同學(xué)整天不用干別的事了。也由此引出了今天要說的 kt-connect 工具,通過這個(gè)工具,后端研發(fā)本地的電腦可以代理訪問到各個(gè)分支環(huán)境,也就是 K8S 里面的命名空間的所有服務(wù),并且只需要啟動(dòng)需要調(diào)試的服務(wù),大大節(jié)省了電腦 CPU 內(nèi)存占用。

選型

在選擇代理訪問 K8S 環(huán)境以便于本地調(diào)試的工具中,網(wǎng)上有幾種。

1. 端口轉(zhuǎn)發(fā)

使用 Ingress、NodePort、LoadBalancer 之類的將流量轉(zhuǎn)發(fā)到指定端口,如上文所說,會(huì)讓運(yùn)維同學(xué)工作量比較大,也不便于分支環(huán)境的自動(dòng)創(chuàng)建和回收,只適合需要暴露端口數(shù)量不多的場景。

2. VPN

通過在 K8S 每個(gè)命名空間里面設(shè)置一個(gè)運(yùn)行有 VPN 服務(wù)的 POD,后端研發(fā)筆記本通過 VPN 客戶端連接代理進(jìn)入到指定命名空間,可以正常訪問和解析集群內(nèi)各類服務(wù),基本能滿足日常的要求,缺點(diǎn)是每個(gè)命名空間都常駐了一個(gè) VPN 服務(wù)的運(yùn)行資源。

3. Telepresence

在搜索的過程中發(fā)現(xiàn)了這個(gè)代理工具,幾乎可以說 9 成的中英文技術(shù)文章都推薦使用這個(gè)工具,功能非常強(qiáng)大,不但提供了 VPN 所具有的代理功能,可以訪問到命名空間內(nèi)所有服務(wù),還能指定各種規(guī)則攔截指定服務(wù)的流量到本地機(jī)器,相當(dāng)于本地機(jī)器也能作為一個(gè)普通的 POD 提供對外服務(wù)。大體設(shè)計(jì)原理如下:

37cc96a6-372a-11ed-ba43-dac502259ad0.png

在研發(fā)本地電腦執(zhí)行如下命令

telepresencehelminstall--kubeconfig.kubeconfig
telepresenceconnect---kubeconfig.kubeconfig

就會(huì)自動(dòng)在 K8S 集群創(chuàng)建一個(gè)命名空間 ambassador,并且部署一個(gè) traffic-manager 的 pod,用于流量管理,而在研發(fā)筆記本本地則會(huì)啟動(dòng) 2 個(gè) daemon 服務(wù),其中一個(gè)叫 Root Daemon,用于建立一條雙向代理通道,并管理本地電腦與 K8S 集群之間的流量,另外一個(gè) User Daemon 則是負(fù)責(zé)與 Traffic Manager 通信,設(shè)置攔截規(guī)則,如果登錄后還負(fù)責(zé)與 Ambassador Cloud 進(jìn)行通信。

通過配置攔截規(guī)則,攔截的 POD 里面會(huì)安裝一個(gè) traffic-agent,官方文檔說明是類似 K8S 集群的 sidecar 模式,對注入 POD 進(jìn)行流量劫持,所有流量出入通過 traffic-manager 進(jìn)行重新路由。

The Traffic Agent is a sidecar container that facilitates intercepts. When an intercept is first started, the Traffic Agent container is injected into the workload's pod(s).

雖然他的功能很強(qiáng)大,但是在目前 2.5 版本的使用過程中,為了使用他的攔截和 Preview Url 功能必須在他家的商業(yè)云平臺 Ambassador Cloud 進(jìn)行注冊登陸(注:不知道為什么網(wǎng)上技術(shù)文章都沒提到這點(diǎn),測試的時(shí)候非得要登錄他家云平臺),并且攔截規(guī)則的配置是通過云平臺的網(wǎng)頁進(jìn)行操作的,聯(lián)網(wǎng)的要求,包括可能存在的安全,泄露之類的隱患,我覺得是不可接受,也因此不得不放棄使用這個(gè)工具。

還有一個(gè)不得不說的缺點(diǎn)就是,老版本使用后可以清理掉自動(dòng)創(chuàng)建的命名空間(namespace)和 pod、攔截 agent 的功能(telepresence uninstall)也沒了,在 2.5 版本的命令參數(shù)里面完全消失了,這就導(dǎo)致每次使用后,如果想保持環(huán)境干凈,還得麻煩運(yùn)維同學(xué)去清理掉,非常麻煩,簡直逼死潔癖患者。

4. kt-connect

所幸開源社區(qū)又找到了另外一款類似 Telepresence 的工具,名為 kt-connect:

https://github.com/alibaba/kt-connect

使用版本為 v0.3.6(順便說下我們使用的 K8S 版本是 1.24),并且它無需聯(lián)網(wǎng)登陸什么賬號,結(jié)束命令執(zhí)行默認(rèn)還會(huì)自動(dòng)清理。阿里出品,不確定是不是又一個(gè) KPI 開源項(xiàng)目,但是至少這一刻我對這個(gè)工具是非常滿意的。

原理

同 Telepresence 類似,但不同的是,kt-connect 只會(huì)在指定連接的命名空間(namespace)里面新建一個(gè)自用的 pod,然后部署一個(gè) kt-connect-shadow 的鏡像。相比 Telepresence,它在模式進(jìn)行了細(xì)分?jǐn)U展,分為四大模式:

1. Connect 模式

ktctl.execonnect--kubeconfig.kubeconfig--namespacefeature-N--debug

這個(gè)模式下,kt-connect 起到的是一個(gè)類似于 VPN 的作用,研發(fā)本地電腦可以訪問到連接的命名空間(namespace)內(nèi)的所有服務(wù),但是并沒有加到集群里面其他服務(wù)里面,其他服務(wù)的流量并不會(huì)轉(zhuǎn)發(fā)到本地電腦。

注 1: 與 telepresence 類似,kt-connect 所有命令都要帶上--kubeconfig,確保有足夠權(quán)限和能正確連接 K8S 集群的 API Server,很多文章都很少提到這點(diǎn),假如 K8S 集群限制權(quán)限,或者與研發(fā)不在同一個(gè)網(wǎng)絡(luò),必須確保使用運(yùn)維同學(xué)提供的有足夠權(quán)限的授權(quán)文件 kubeconfig 來進(jìn)行連接。
注 2:

Failedtosetupportforwardlocal:28344->podkt-connect-shadow-gseak:53error="errorupgradingconnection:errorsendingrequest:Post"[https://10.0.8.101:8443/api/v1/namespaces/feature-N/pods/kt-connect-shadow-gseak/portforward](https://10.0.8.101:8443/api/v1/namespaces/feature-N/pods/kt-connect-shadow-gseak/portforward)":dialtcp10.0.8.101connectex:Asocketoperationwasattemptedtoanunreachablehost.",

如果出現(xiàn)以上報(bào)錯(cuò)的話,有可能是 kt-connect 路由 BUG,可能本地電腦的路由與新加的通往 API Server 的路由有沖突,增加參數(shù)--excludeIps 10.0.8.101/32 即可,如果網(wǎng)段沖突比較多,可以擴(kuò)大網(wǎng)段范圍,例如--excludeIps 10.0.8.0/24 參考 issue-302:

https://github.com/alibaba/kt-connect/issues/302

ktctl.execonnect--kubeconfig.kubeconfig--namespacefeature-N--excludeIps10.0.8.101/32--debug

2. Exchange 模式

ktctl.exeexchangeserviceA--kubeconfig.kubeconfig--namespacefeature-N--expose12001--debug

這個(gè)模式類似于 Telepresence 攔截模式,將指定服務(wù)的所有流量攔截下來轉(zhuǎn)發(fā)到研發(fā)本地電腦的端口,使用這個(gè)模式能對環(huán)境里的訪問請求直接進(jìn)行調(diào)試。
具體原理就是將 service 里面的 pod 替換成一個(gè) serviceA-kt-exchange 的 pod。

注 1: Exchange 模式的流量方向是單向的,并不會(huì)將本地電腦主動(dòng)發(fā)起的請求代理過去,如果 K8S 集群跟研發(fā)本地電腦不在一個(gè)網(wǎng)段內(nèi),需要另外開一個(gè)命令行運(yùn)行 Connect 模式,確保本地服務(wù)可以正常連接 K8S 集群的其他服務(wù),參考 issue-216:

https://github.com/alibaba/kt-connect/issues/216

注 2: Exchange 模式是通過攔截 service 進(jìn)行流量轉(zhuǎn)發(fā),假如集群的請求沒有經(jīng)過 service,例如直接解析到 pod 之類,可能就會(huì)出現(xiàn)攔截失敗的情況(同理 Mesh 模式也是如此),所以出現(xiàn)問題記得跟運(yùn)維同學(xué)確認(rèn) K8S 集群內(nèi)的路由情況。

3. Mesh 模式

kctl.exemeshserviceA--kubeconfig.kubeconfig--namespacefeature-N--expose12001--debug

執(zhí)行命令后可以看到輸出日志里面包含類似文字:

2:30PMINFNowyoucanaccessyourservicebyheader'VERSION:xxxxx'

這個(gè)模式本地電腦的服務(wù)和 K8S 集群里面相同的服務(wù)同時(shí)對外響應(yīng)請求,但是只有通過指定的 http 請求頭 VERSION: xxxx 的請求才會(huì)轉(zhuǎn)發(fā)到本地電腦,相比 Exchange 模式,保證了其他人服務(wù)正常使用,同時(shí)研發(fā)又能進(jìn)行本地調(diào)試。每次生成的請求頭 VERSION 的值都是動(dòng)態(tài)生成的,如果要固定這個(gè)值,可以通過參數(shù)--versionMark 寫死,例如固定值為 test-version,命令如下:

kctl.exemeshserviceA--kubeconfig.kubeconfig--namespacefeature-N--expose12001--debug--versionMarktest-version

具體原理就是將 serviceA 里面的 Pod 替換成一個(gè) serviceA-kt-router 的路由鏡像,負(fù)責(zé)根據(jù)請求頭進(jìn)行流量代理轉(zhuǎn)發(fā),另外生成一個(gè) serviceA-kt-stuntman 服務(wù),這個(gè)就是線上正常運(yùn)行的 serviceA,還有一個(gè) serviceA-kt-mesh-xxxxx 服務(wù),這個(gè)就負(fù)責(zé)將代理流量到本地電腦。

4. Preview 模式

kctl.exepreviewserviceB--kubeconfig.kubeconfig--namespacefeature-N--expose12001

不同于 Exchange 和 Mesh 模式要求 K8S 集群有一個(gè)在運(yùn)行的服務(wù),Preview 模式可以將本地電腦運(yùn)行的程序部署到 K8S 集群中作為一個(gè)全新的 Service 對外提供服務(wù),非常便于新建服務(wù)的開發(fā)調(diào)試、預(yù)覽等作用。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8701

    瀏覽量

    84548
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3712

    瀏覽量

    64025
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    646

    瀏覽量

    32670

原文標(biāo)題:K8S 本地調(diào)試高效工具包 kt-connect 使用,阿里開源!

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    DMK如何進(jìn)行硬件調(diào)試???

    有哪位大俠,能講解一下DMK如何進(jìn)行硬件調(diào)試???(不是軟件設(shè)計(jì),而是打開一個(gè)程序,要看看它運(yùn)行到哪里了?該如何做?先前51單片機(jī)用的少,我查了一些資料,網(wǎng)上也搜了一下,都不是很具體。)
    發(fā)表于 05-03 16:06

    請問如何進(jìn)入?yún)R編中斷程序中的匯編宏單元進(jìn)行調(diào)試

    何進(jìn)入?yún)R編中斷程序中的匯編宏單元進(jìn)行調(diào)試?可以在c語言跳轉(zhuǎn)進(jìn)入的匯編中斷程序中進(jìn)行調(diào)試,可以單步執(zhí)行一條匯編宏指令,但是想進(jìn)入宏匯編程序中
    發(fā)表于 10-30 10:12

    使用mbed如何進(jìn)行程序調(diào)試呢?

    今天使用論壇金幣兌換的Nucleo板子進(jìn)行測試,采用mbed的方式完成LED燈點(diǎn)亮和外部按鍵中斷功能,感覺確實(shí)程序編寫簡單,可以幾句話,幾分鐘就完成一個(gè)簡單的功能,可是有一個(gè)困惑,不可能出來的程序都是可以用的,沒有一點(diǎn)問題,使用mbed如何進(jìn)行程序
    發(fā)表于 11-07 08:35

    何進(jìn)行linux下的adb調(diào)試工具安裝

    對于安卓的開發(fā)人員來說,大家都應(yīng)該在windows下面使用adb調(diào)試工具。其安裝并不是很難,且也有豌豆莢這個(gè)軟件可以使用,可以自動(dòng)安裝驅(qū)動(dòng)。但是Linux的adb如何進(jìn)行安裝呢?下面就是就我自己個(gè)人的意見和小小的經(jīng)驗(yàn)給大家介紹下,如有問題可以留言。
    發(fā)表于 07-19 07:11

    講解STM32F1開發(fā)板如何進(jìn)行調(diào)試

    Table of Contents前言調(diào)試原理軟件調(diào)試?硬件調(diào)試前言這一篇博客主要講解STM32F1開發(fā)板如何進(jìn)行調(diào)試,分別是硬件
    發(fā)表于 08-11 08:41

    PC機(jī)的串口調(diào)試助手與STM32是如何進(jìn)行數(shù)據(jù)收發(fā)的

    怎樣通過PC機(jī)的串口調(diào)試助手將數(shù)據(jù)發(fā)送至STM32呢?PC機(jī)的串口調(diào)試助手與STM32是如何進(jìn)行數(shù)據(jù)收發(fā)的?
    發(fā)表于 12-09 07:17

    應(yīng)用熱更新如何進(jìn)行嵌入式設(shè)備開發(fā)調(diào)試?

    應(yīng)用熱更新如何進(jìn)行嵌入式設(shè)備開發(fā)調(diào)試
    發(fā)表于 12-23 06:02

    Android5.1系統(tǒng)下的uart串口是如何進(jìn)行調(diào)試

    Android5.1系統(tǒng)下的uart串口是如何進(jìn)行調(diào)試的?有哪些調(diào)試步驟?
    發(fā)表于 03-03 09:48

    直流穩(wěn)壓電源如何進(jìn)行安裝與調(diào)試

    本文檔的主要內(nèi)容詳細(xì)介紹的是直流穩(wěn)壓電源如何進(jìn)行安裝與調(diào)試。通過本項(xiàng)目的訓(xùn)練,可學(xué)會(huì)利用三端集成穩(wěn)壓器件裝調(diào)典型穩(wěn)壓源并掌握集成穩(wěn)壓電源的應(yīng)用特性。
    發(fā)表于 11-28 15:21 ?39次下載
    直流穩(wěn)壓電源如<b class='flag-5'>何進(jìn)行</b>安裝與<b class='flag-5'>調(diào)試</b>

    ESP8266EX最佳的射頻性能如何進(jìn)行頻偏調(diào)試和天線阻抗匹配

    本文介紹了要獲得 ESP8266EX 芯片最佳的射頻性能如何進(jìn)行頻偏調(diào)試和天線阻抗匹配。
    發(fā)表于 03-15 08:00 ?129次下載
    ESP8266EX最佳的射頻性能如<b class='flag-5'>何進(jìn)行</b>頻偏<b class='flag-5'>調(diào)試</b>和天線阻抗匹配

    何進(jìn)行程序的擴(kuò)展

    本文檔的主要內(nèi)容詳細(xì)介紹的是程序的擴(kuò)展性如何進(jìn)行程序的擴(kuò)展。
    發(fā)表于 04-26 18:26 ?0次下載
    如<b class='flag-5'>何進(jìn)行</b>程序的擴(kuò)展

    何進(jìn)行OPCDCOM配置

    何進(jìn)行OPCDCOM配置(四會(huì)理士電源技術(shù)有限公司招聘)-如何進(jìn)行OPCDCOM配置? ? ? ? ? ? ? ? ? ? ??
    發(fā)表于 09-18 14:23 ?11次下載
    如<b class='flag-5'>何進(jìn)行</b>OPCDCOM配置

    焊接變位機(jī)如何進(jìn)行調(diào)試,有哪些注意事項(xiàng)

    焊接變位機(jī)如何進(jìn)行調(diào)試?在正式使用焊接變位機(jī)進(jìn)行焊接之前,要注意對設(shè)備的調(diào)試方法,并注意使用,從而保證焊接精度,我們需要根據(jù)合理的調(diào)試流程
    發(fā)表于 11-02 16:57 ?2703次閱讀

    如何使用pkgs-test工具進(jìn)行本地調(diào)試?

    pkgs-test作為一個(gè)可以在github actions上面運(yùn)行檢查軟件包編譯情況的工具,同時(shí)也可以在本地使用。
    的頭像 發(fā)表于 09-21 15:00 ?573次閱讀

    西門子伺服電機(jī)維修如何進(jìn)行調(diào)試

    西門子伺服電機(jī)維修如何進(jìn)行調(diào)試?
    的頭像 發(fā)表于 11-23 11:00 ?1146次閱讀