基於idea做java程式的本地k8s調試-skaffold(一)

先介紹下本篇文章是基於ideas下開發微服務的場景,大家都知道微服務嘛,一個個微的服務…很多,先不談調試,要跑起來都費力,可能的原因有:

  1. 環境變數的配置,如果多個項目穿插著來,env變數可能廢了,亂了
  2. host文件的改變,有些環境變數是通過hostname來解析的,而不是ip,可能多個項目對應的hostname字元串都一個(但是ip不同),比如redis/mysql這種中間件名稱的定義
  3. 有些基礎服務,還不得不啟動,才能有業務的run或者debug這說,不然免談,跑不起來,比如認證服務、網關等,機器爛的話,呵呵了
  4. 其他等等等等

最後跑起來了,但是跑到運維環境里又出問題了,為啥?也許:

  1. ideas下run/debug模式和mvn打包後的jar不一致,可能class不一致,如版本不同,或者打了多個不同版本進jar里
  2. 環境變數不同,到了運維環境里,環境變數不一致,導致無法啟動,比如找不到配置中心,然後就application start failed
  3. 其他等等等等

這麼解決這些問題呢?用skaffold,下面先介紹下skaffold:

Skaffold是一款命令行工具,旨在促進Kubernetes應用的持續開發。

就是這麼簡短!就是說用k8s,然後套個持續集成的工具來自動化。只要發到和最終運維環境一致的環境下進行debug,不就解決了么。還真是,至於為什麼這麼說的邏輯推理,大家自己百度。

 

下面就看看skaffold是如何持續發布到k8s的,上個圖吧:

 

 

 

 只需要1個按鈕,就能發布到k8集群里,並且日誌什麼的,狀態監控等等都有了,當然,前提是裝完以及配置完相應插件。效果目前為止挺好。

需要安裝的ideas插件:Cloud Code, 同樣是google出品(skaffold同樣是google出品)

 

 然後進行配置:

 

 上述紅框框內的3個命令行,需要大家自行安裝

  1. skaffold://skaffold.dev/docs/install/#standalone-binary
  2. minikube: //minikube.sigs.k8s.io/docs/start/

安裝相對容易,這裡不展開了。

啟動minikube集群時,需要注意些參數配置,因為防火牆的關係,默認會打包失敗,或者無法下載情況出現,我這的啟動參數如下:

 

 –force是因為我本機是ubuntu的root帳號,必須加這個參數才能啟動集群

–image開頭的參數都是中國代理

–cpus是代表minikube所能使用的cpu核心數,默認只有2個cpus,會很慢

接下來,要讓skaffold工作,就需要兩種文件:

  1. skaffold定義文件
  2. k8s定義文件 

 

上述圖片來自skaffold官網,講的是skaffold管道,skaffold的yaml文件就是用來定義這個管道的,如下:

 

 artifacts:是鏡像來源,對應的context路徑下必須存在Dockerfile,用於打包用途

deploy用於部署管道,上圖中配置為kubectl命令來部署yaml,這些yaml文件都是k8s的近原生yaml定義,說它是接近原生定義是因為裡面的image會動態改變(由skaffold)

比如這個k8 pod yaml定義:

 

 如果直接原生方式kubectl命令行apply的話,找的是pigx-gateway這個鏡像,但是最終在skaffold下,最終是會動態變更這個image屬性的,如下:

 

 image是會變化的(由skaffold改變,見pipeline圖的tag部分),細心的讀者也看到了,其他好多屬性是被動態加上去的,比如labels屬性。

 到此為止,可以說,只要主程,或者運維,又或者架構師、開發經理,只要有那麼1個人,把這麼一套yaml文件push到git里,組員都能在瞬間本地生成一套和運維環境一致的集群!這次牛逼了,再也不會發上去無法運行,報錯這種問題存在了。