k8s~helm映象版本永遠不要用latest
阿新 • • 發佈:2020-04-18
對於容器編排工具k8s來說,你可以使用它規定的yaml格式的指令碼,使用客戶端kubectl來與k8s進行通訊,將你定義好的yaml部署指令碼應用到k8s叢集上,而這對yaml指令碼一般來說都是很像的,就是說,你需要反覆的使用同樣結構的程式碼,這對於開發人員來說不是一個好的訊號,所以helm出現了,它是一種模板化的部署工具,你定義好模板之後,把變數的物件放在values.yaml裡就可以了。
引起的問題
在使用helm進行部署時出現了一個問題,使用映象時習慣的使用了latest這個版本,也就是最新版本,在使用helm進行部署時,對於相同版本號的映象來說,它對於的pod居然沒有從新編排,這個問題直接影響了整個部署的方式,在jenkins專案部署之後,還需要手動進行pod的部署,這顯然是不能接受的,最後在helm裡打算使用docker具體的映象版本號。
使用步驟
- jenkins從gitlab上拉取專案原始碼
- 編譯專案,測試專案
- 打包專案成為映象,映象版本使用jenkins的TagId,它是當前任務的版本,我們可以直接用
- 上傳映象到私有倉庫harbor裡
- 拉取Helm Chart倉庫程式碼,這個倉庫裡儲存所有服務需要的Charts資訊
- 使用sed命令將當前TagId寫入Charts到values.yaml檔案的對應服務映象版本的位置,使用了yaml的錨點和引用功能
- 使用helm package打包你的服務
- 使用helm upgrade升級你的現有服務
- 將charts倉庫的變化儲存,然後提交到gitlab裡
- 整個部署過程完畢!
sed命令小技巧
使用sed命令可以在文件中查詢某些字元,並且在這些字元所在行的下一行去插入新的內容
sh """ sed -i "/${config.imageName}-imageTag/{n;d}" ${WORKSPACE}/charts/${config.namespace}/values.yaml sed -i "/${config.imageName}-imageTag/a \\ imageTag: $config.tagId" ${WORKSPACE}/charts/${config.namespace}/values.yaml """
上面程式碼中,我們對values.yaml裡的某個服務名字尾是-imageTag的內容的下一行進行刪除;並且在它的下一行插入新的內容imageTag:版本號;這一行請注意,我們使用了兩個\,它是一個轉義付符號,它會在imageTag前面插入一些空格。
yaml裡的錨點和引用
你可以為values.yaml裡新增一個引用片斷,然後在values.yaml其它位置使用它們,即它類似於先定義一些內容,然後在一些位置插入它們。
hello-world-imageTag: &helloworldImageTagId
imageTag: 1
appList:
- name: hello-world
port: 9001
hasVM: true
<<: *helloworldImageTagId
上面的程式碼,在hasVM這行下面,就裡引用我們的imageTag: 1這行的內容,而
helloworldImageTagId
是我們定義的別名,在引用的位置需要使用這個別名。
這篇文章對於正在使用jenkins,k8s部署你的微服務的同事來說,是非常不錯的文章