KT Connect作為一款開發環境治理的輕量級工具已經越來越受歡迎,官方文檔非常詳細請參考 https://alibaba.github.io/kt-connect/#/zh-cn 支持mac、linux、windows多種平臺(windows由於諸多限制, 體驗方面和其他平臺相比略差)。經過最近一段時間的使用, 我想通過本篇文章對KT Connect的實現思路做一個梳理, 同時把這款好的工具安利給大家(有需求可以在githu上提issue,作者很勤快的)
前置條件
- sshuttle(https://sshuttle.readthedocs.io/en/stable/overview.html)
- kubectl
- ktctl
- 本機具備訪問k8s的能力
注: 對於內網的k8s集群可以通過拷貝kubernetes的config文件到本地並且修改server地址為 https://kubernetes:6443, 通過在hosts文件中增加config中master節點的外網地址達到訪問內網k8s集群的目的 eg: xx.xx.xx.xx kubernetes
核心組件sshuttle | ssh
KT Connect基於sshuttle和ssh端口轉發為開發者提供了強大的功能。
ssh端口轉發介紹
ssh端口轉發也稱為ssh隧道,因為他們通過ssh登錄以後在ssh的客戶端和服務器端建立一個隧道,從而進行通信。ssh的數據轉發是經過加密的, 因此通過ssh隧道建立連接交換數據是非常安全的。ssh的端口轉發可以分為多種, 下面介紹下常用的三種
- 本地端口轉發
將發送到本地端口的請求轉發到目標主機端口, 從而達到訪問目標主機端口的目的。
格式:
<code>ssh -L localPort:remoteHost:remotePort/<code>
例:
<code>// 本地主機登錄到目標主機,通過訪問本地2000端口訪問目標主機的3000端口服務
ssh -L 2000:localhost:3000 [email protected]/<code>
- 遠程端口轉發
將發送到遠端主機端口的請求轉發到目標主機,這樣可以通過訪問遠端端口來達到訪問目標主機端口的目的。
格式:
<code>ssh -R remotePort:targetHost:targetPort/<code>
例:
<code>// 本地登錄到遠程主機,通過訪問遠端2000端口訪問本機的3000端口
ssh -R 2000:localhost:3000 [email protected]/<code>
- 動態端口轉發
針對本地端口轉發和遠程端口轉發,都存在兩個一一對應的端口,分別位於ssh的客戶端和服務端,動態端口轉發則只綁定一個本地端口,而targetHost:targetPort則是不固定的。targetHost:targetPort是由發起的請求決定的,比如,請求地址為192.168.1.12:3000,則通過ssh轉發的請求地址也是192.168.1.12:3000。
格式:
<code>ssh -D localhost:localPort/<code>
例:
<code>// 本地主機登錄到目標主機, 並進行動態端口
轉發ssh -D localhost:3000 [email protected]/<code>
KT Connect核心功能實現解析
KT Connect提供的幾種服務都是通過在集群中部署shadow服務和本地的ktctl配合完成。其實可以理解shadow為Server,ktctl為Client,只要在這兩個服務間建立起隧道即可解決本地與線上集群的網絡問題。以下主機針對connect、exchange、mesh、run進行介紹。
- connect
ktctl connect利用sshuttle為開發者提供了本地訪問集群服務的能力, 支持ip地址和dns兩種。
執行ktctl connect, 過程如下:
- 執行 ktctl connect, 部署shadow到k8s集群, 至於shadow部署到那個namespace使用什麼鏡像都可以自己指定。同時生成一個ssh的密鑰對, 公鑰掛載到shadow容器中。私鑰保留在本地主機(後續使用sshuttle的時候需要用到私鑰)
- 執行kubectl port-forward命令, 使shadow服務的端口映射到主機端口
- 執行sshuttle命令, 開啟dns(dns地址即為shadow的endpoint ip)和ssh選項。建立起遠端和本地的ssh隧道
到此connect的所有流程已經走完了。你可以在本地訪問集群中任意服務的ip:port或者dns:port
- exchange
ktctl exchange將流量從本地引向集群, 也就是說可以在集群裡面直接訪問本地服務。有了這個功能直接省去了我們很多重複而且耗時的工作,比如打鏡像,升級服務等等。使用如下:
- 運行一個本地服務 docker run -itd -p 8080:80 nginx
- 將本地服務暴露給集群ktctl exchange tomcat --expose 8080
過程如下:
- 將已經存在的目標服務tomcat縮容為0
- 重複connect步驟一,創建shadow服務並掛載公鑰文件
- 執行kubectl port-forward命令, 使shadow服務的端口映射到主機端口
- 執行ssh的遠程端口轉發(ssh -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -i privateKey -R tomcatPort:127.0.0.1:localPort root@remoteHost -p remoteSSHPort),上述例子中相當於把tomcat的流量轉發到本地指定端口。
此時在集群裡面原有的應用就被本地服務給替換了,從而達到exchange的目的
- mesh
ktctl mesh在exchange的基礎上做了擴展, 並不是直接替換原有應用, 而是增加版本做規則路由。
執行ktctl mesh tomcat --expose 8080
過程如下:
- 找出名為tomcat的deploy,基於該deploy標籤進行復制,部署一個鏡像為shadow的deploy。該deploy會以tomcat-kt加一個五位隨機字符命名。而這個隨機字符串就是該deploy的版本號
- 執行kubectl port-forward命令, 使shadow服務的端口映射到主機端口
- 執行ssh的遠程端口轉發,把遠程指定端口流量指向本地應用
- 此時萬事具備, 只要修改istio路由規則就可以將滿足條件的流量轉向本地服務
- run
ktctl run localservice --port 8080 --expose
其實原理同exchange一樣, 唯一的區別在於沒有替換集群中的服務。而是在集群中新建了一個svc, 用戶可以通過svc或者ip訪問到本地服務。
通過上述示例, 相信大家對TK Connect功能和細節有了一個大致瞭解。
另外KT Connect還提供了可視化(dashboard)查看當前服務狀態, check檢查當前環境依賴, 更詳細的使用請參考官網說明
總 結
傳統的自動化流水線已經很大程度提高了我們的研發效率, 但是對於開發環境來講, 我們可能做一行代碼的調整同樣要走完整個自動化流水線,無疑浪費了寶貴的時間。KT Connect打破了網絡限制實現了本地聯調,真正解決了研發人員的痛點大大提高了研發效率,無疑為團隊節約了大量的時間成本。
原文鏈接:https://mp.weixin.qq.com/s/X3pDjfFGJiEMWSk8El1ylA
關於睿雲智合
深圳睿雲智合科技有限公司成立於2012年,總部位於深圳,並分別在成都、深圳設立了研發中心,北京、上海設立了分支機構,核心骨幹人員全部為來自金融、科技行業知名企業資深業務專家、技術專家。早期專注於為中國金融保險等大型企業提供創新技術、電子商務、CRM等領域專業諮詢服務。
自2016年始,在率先將容器技術引進到中國保險行業客戶後,公司組建了專業的容器技術產品研發和實施服務團隊,旨在幫助中國金融行業客戶將容器創新技術應用於企業信息技術支持業務發展的基礎能力改善與提升,成為中國金融保險行業容器技術服務領導品牌。
此外,憑藉多年來在呼叫中心領域的業務經驗與技術積累,睿雲智合率先在業界推出基於開源軟交換平臺FreeSwitch的微服務架構多媒體數字化業務平臺,將語音、視頻、webchat、微信、微博等多種客戶接觸渠道集成,實現客戶統一接入、精準識別、智能路由的CRM策略,並以容器化治理來支持平臺的全應用生命週期管理,顯著提升了數字化業務處理的靈活、高效、彈性、穩定等特性,為幫助傳統企業向“以客戶為中心”的數字化業務轉型提供完美的一站式整體解決方案。
閱讀更多 睿雲智合Wise2C 的文章