本文作者:黃鑫鑫 - Nocalhost 項目核心開發者
騰訊雲 CODING DevOps 研發工程師。碩士畢業於中山大學數據科學與計算機學院,曾負責過平安雲主機及國家超算中心容器雲平台等相關業務,熟悉虛擬機,容器,K8s 相關技術,專注於雲原生領域
簡介
本文通過使用 Nocalhost 將本地開發機無縫連接到一個遠程 Kubernetes 集群, 並在本地使用 Goland 來開發和調試 Kubernetes 集群中的 Apache APISIX ingress controller
。Nocalhost 讓我們可以使用現有的技術棧來順暢地開發和調試類似 APISIX ingress controller
的 K8s 應用。
本文包括:
- 在 IDE 中部署
APISIX Ingress controller
到遠程 Kubernetes 集群 - 使用 Nocalhost 開發和調試 Kubernetes 集群上的
APISIX ingress controller
環境准備
- 准備一個可用的 Kubernetes 集群。 可以使用任意擁有命名空間管理權限的 Kubernetes 集群
- 確保本地已安裝好 Helm v3.0+
- 集群中已安裝好 APISIX (APISIX Ingress controller 的依賴)
- GoLand IDE 2020.03+
- 安裝 Nocalhost JetBrains 插件
- 安裝 Go 1.13 及以上版本
部署 APISIX Ingress Controller
按照以下步驟,在 GoLand 中通過 Nocalhost 部署 APISIX Ingress Controller:
- 在 GoLand 中打開 Nocalhost 插件
- 選擇將要部署 APISIX Ingress Controller 的命名空間
- 右鍵點擊選定的命名空間, 選擇
Deploy Application
, 然后選擇Helm Repo
作為安裝方法 - 在對話框中
Name
中輸入:apisix-ingress-controller
,在Chart URL
中輸入:https://charts.apiseven.com
部署完成后,我們通過在 IDE 內啟用端口轉發來測試 apisix-ingress-controller
:
- 在 Nocalhost 插件的 Workloads 中找到
apisix-ingress-controller
,右鍵點擊並選擇Port Forward
- 添加端口轉發
8080:8080
- 在本地訪問
http://127.0.0.1:8080/healthz
並檢查結果
開發 APISIX Ingress Controller
Step 1. 進入 DevMode
- 右鍵點擊
apisix-ingress-controller
工作負載, 選擇Start DevMode
- 如果已經將源碼克隆到本地,請選擇源代碼目錄。 否則通過輸入
apisix-ingress-controller
的源碼倉庫地址https://github.com/apache/apisix-ingress-controller.git
來讓 Nocalhost 克隆源代碼到本地 - 等待操作完成,Nocalhost 將在進入 DevMode 后在 IDE 內打開遠程終端
打開遠程終端后,通過在遠程終端中輸入以下命令來啟動 apisix-ingress-controller
進程:
go run main.go ingress --config-path conf/config-default.yaml
apisix-ingress-controller
啟動后,通過 http://127.0.0.1:8080/healthz
訪問服務, 並檢查結果:
Step 2. 修改代碼並檢查結果
現在我們來修改一下代碼並看看效果:
- 停止
apisix-ingress-controller
進程 - 在 Goland 中搜索 healthz 並找到 router.go 文件。 將 healthzResponse 的狀態代碼從 ok 更改為 Hello Nocalhost
- 重新啟動進程並在本地檢查更改結果
可以看到我們無需重新構建鏡像,幾秒后便可以看到改動的結果:
Step 3. 結束開發模式
開發完畢后,我們可以通過以下步驟結束 DevMode:
- 右鍵點擊
apisix-ingress-controller
- 選擇並點擊
End DevMode
Nocalhost 將會讓 apisix-ingress-controller
結束 DevMode, 並重置 apisix-ingress-controller
到其原始版本。 啟用端口轉發來看看結束 DevMode 后的結果:
需要注意的是,DevMode 模式下,所有代碼更改都只在 開發容器 中生效。退出 DevMode 后,Nocalhost 將會將遠程容器重置為原始狀態(進入 DevMode 之前的版本)。 通過這種方式,在退出 DevMode 以后,在 DevMode 模式下做的修改都不會影響原有環境。
調試 APISIX Ingress Controller
調試應用程序是一件麻煩的事,在 Kubernetes 集群中調試應用程序則更加麻煩。 Nocalhost 可以幫助我們在調試 Kubernetes 集群中的程序時獲得和在 IDE 中直接調試本地程序同樣的體驗。
Step 1. 開啟遠程調試
我們可以通過以下方式開始遠程調試:
- 右鍵點擊
apisix-ingress-controller
並選擇Remote Debug
- Nocalhost 將會先讓 apisix-ingress-controller 進入DevMode, 並運行在
dev config
中定義的調試命令
Step 2. 設置斷點
我們在 healthz 函數上設置一個斷點, 設置好斷點后,在瀏覽器中訪問 http://127.0.0.1:8080/healthz ,會觸發斷點,GoLand 會跳到前台。 點擊調試相關按鈕可對程序進行調試:
遠程運行 APISIX Ingress Controller
Nocalhost 不僅僅可以用來遠程調試應用,通過使用 Remote Run
功能,還可以讓為我們快速地在 Kubernetes 集群中運行開發中的應用程序。
我們可以通過以下步驟使用 Remote Run
功能:
- 右鍵點擊
apisix-ingress-controller
,並選擇Remote Run
- Nocalhost 將會先讓
apisix-ingress-controller
進入DevMode
, 並運行在dev config
定義的運行命令
每次更改代碼完代碼后,Nocalhost 都會自動觸發運行命令,將程序運行起來:
總結
通過以上步驟,我們已經學會如何使用 Nocalhost 來開發和調試 Kubernetes 集群中的 APISX ingress controller。 使用 Nocalhost,我們不再需要等待緩慢的本地開發循環反饋,而是通過一種高效的雲原生開發方式來得到快速的反饋。