k8s~helm鏡像版(ban)本永遠不要用(yong)latest
對(dui)于容器編排(pai)工(gong)具k8s來(lai)(lai)說(shuo),你可以使用它規定(ding)的yaml格(ge)式的腳(jiao)本,使用客戶端kubectl來(lai)(lai)與k8s進行通訊,將你定(ding)義好的yaml部署腳(jiao)本應用到(dao)k8s集群(qun)上,而這(zhe)對(dui)yaml腳(jiao)本一般來(lai)(lai)說(shuo)都是很像(xiang)的,就(jiu)是說(shuo),你需要反復的使用同(tong)樣結構的代碼(ma),這(zhe)對(dui)于開發人(ren)員來(lai)(lai)說(shuo)不是一個好的信號,所(suo)以helm出現了,它是一種模(mo)板化的部署工(gong)具,你定(ding)義好模(mo)板之后(hou),把變(bian)量的對(dui)象(xiang)放在values.yaml里就(jiu)可以了。
引起的問題
在(zai)使用(yong)(yong)helm進(jin)(jin)行(xing)(xing)部署時出現(xian)了(le)一個(ge)問題,使用(yong)(yong)鏡(jing)像(xiang)時習慣的(de)(de)使用(yong)(yong)了(le)latest這(zhe)個(ge)版(ban)本(ben),也就是最新版(ban)本(ben),在(zai)使用(yong)(yong)helm進(jin)(jin)行(xing)(xing)部署時,對于相(xiang)同版(ban)本(ben)號的(de)(de)鏡(jing)像(xiang)來說,它(ta)對于的(de)(de)pod居然沒(mei)有從新編排,這(zhe)個(ge)問題直接影響了(le)整個(ge)部署的(de)(de)方式(shi),在(zai)jenkins項(xiang)目部署之后,還需要(yao)手動進(jin)(jin)行(xing)(xing)pod的(de)(de)部署,這(zhe)顯(xian)然是不能接受的(de)(de),最后在(zai)helm里打算使用(yong)(yong)docker具體(ti)的(de)(de)鏡(jing)像(xiang)版(ban)本(ben)號。
使用步驟
- jenkins從gitlab上拉取項目源代碼
- 編譯項目,測試項目
- 打包項目成為鏡像,鏡像版本使用jenkins的TagId,它是當前任務的版本,我們可以直接用
- 上傳鏡像到私有倉庫harbor里
- 拉取Helm Chart倉庫代碼,這個倉庫里存儲所有服務需要的Charts信息
- 使用sed命令將當前TagId寫入Charts到values.yaml文件的對應服務鏡像版本的位置,使用了yaml的錨點和引用功能
- 使用helm package打包你的服務
- 使用helm upgrade升級你的現有服務
- 將charts倉庫的變化保存,然后提交到gitlab里
- 整個部署過程完畢!
sed命令小技巧
使用(yong)sed命令可以(yi)在(zai)文檔中(zhong)查找(zhao)某些(xie)字符,并且在(zai)這些(xie)字符所在(zai)行(xing)的(de)下一行(xing)去(qu)插入新的(de)內容
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
"""
上面(mian)代碼中,我們對(dui)values.yaml里的(de)(de)某個服務名(ming)后(hou)綴是(shi)-imageTag的(de)(de)內容的(de)(de)下一(yi)(yi)行進行刪除;并(bing)且(qie)在它的(de)(de)下一(yi)(yi)行插入(ru)新的(de)(de)內容imageTag:版本(ben)號;這一(yi)(yi)行請注意(yi),我們使用了兩(liang)個\,它是(shi)一(yi)(yi)個轉(zhuan)義付符號,它會在imageTag前面(mian)插入(ru)一(yi)(yi)些空格。
yaml里的錨點和引用
你可以為values.yaml里添加一(yi)(yi)個引用(yong)片(pian)斷(duan),然后(hou)在values.yaml其它(ta)位置(zhi)(zhi)使用(yong)它(ta)們,即它(ta)類似(si)于先定義一(yi)(yi)些內容(rong),然后(hou)在一(yi)(yi)些位置(zhi)(zhi)插入它(ta)們。
hello-world-imageTag: &helloworldImageTagId
imageTag: 1
appList:
- name: hello-world
port: 9001
hasVM: true
<<: *helloworldImageTagId
上面的代碼,在hasVM這行下面,就里引用我們的imageTag: 1這行的內容,而
helloworldImageTagId是我們定義的(de)別名(ming),在引(yin)用的(de)位置(zhi)需(xu)要(yao)使用這個別名(ming)。
這篇文章(zhang)對于正在(zai)使用jenkins,k8s部署你的微服務(wu)的同事(shi)來說(shuo),是(shi)非常不錯的文章(zhang)!