開發(fā)者如何利用有效工具開啟Kubernetes之旅?
過(guò)去幾年,為了讓Kubernetes做到開箱即用,各種各樣的開發(fā)工具如洪水般涌向市場(chǎng)。這也不難理解,沒有誰(shuí)愿意錯(cuò)過(guò)新的技術(shù)趨勢(shì)。但一味追新,有時(shí)候也會(huì)付出慘重代價(jià)。隨著Kubernetes生態(tài)的不斷完善,有的工具可以繼續(xù)發(fā)展,而有一些工具則被時(shí)代拋棄,或者被并入新的產(chǎn)品研發(fā)規(guī)劃中。那么,2021年,作為新手開發(fā)者,該如何把握趨勢(shì),邁向Kubernetes之旅呢?本文將重點(diǎn)介紹關(guān)于Kubernetes的主流應(yīng)用工具,即Helm、Kustomize和Skaffold。
Helm
Helm是Kubernetes的包管理器,是打包、共享和部署k8s應(yīng)用的事實(shí)標(biāo)準(zhǔn)。Helm允許你把多個(gè)YAML配置片段以一致的、結(jié)構(gòu)化的方式組合成一個(gè)邏輯包,即 "chart"。這樣,開發(fā)者在部署應(yīng)用時(shí)可以使用自定義參數(shù),來(lái)確保應(yīng)用程序可配置。另外,你還可以將你的應(yīng)用程序以版本化和可跟蹤的方式發(fā)布到私有或公有存儲(chǔ)庫(kù)中。換言之,Helm為我們提供了強(qiáng)大的封裝機(jī)制,可以確保你的應(yīng)用程序按預(yù)期部署。
另外,通過(guò)Helm,你可以去訪問(wèn)廣泛公開可用的圖表庫(kù),并為你的組織提供任何的chart;你也可以根據(jù)軟件包作者提供的設(shè)置來(lái)定制應(yīng)用程序。最重要的是,我們不必?fù)?dān)心Kubernetes規(guī)范語(yǔ)言的復(fù)雜性,Helm能支持Atomic操作,能最大限度地降低應(yīng)用程序和集群風(fēng)險(xiǎn)。也就是說(shuō),Helm為我們提供了一個(gè)易于理解和隨時(shí)可使用的應(yīng)用程序包。
問(wèn)題是,Helm有哪些新的應(yīng)用功能?
在2019年底,我們看到Helm v3正式發(fā)布,其中刪除了集群側(cè)組件(Tiller)和其他一系列功能。在2020年底,Helm v2被廢止,大多數(shù)chart已經(jīng)遷移到v3格式。如果你還在使用Helm v2,一定要合理分配時(shí)間,在近期規(guī)劃升級(jí)。
在過(guò)去的幾個(gè)版本中,Helm團(tuán)隊(duì)一直忙于解決Helm用戶經(jīng)常抱怨的問(wèn)題,即YAML模板使用問(wèn)題。Helm新增的另一個(gè)完整的功能是后期渲染功能,可以允許我們使用Kustomize等工具時(shí)自定義chart。
最后,但并非最不重要的是,2020年,我們還見證了向更分散方向發(fā)展的chart管理方式的轉(zhuǎn)變,并推出了公共Helm Charts的中央存儲(chǔ)庫(kù)。
Helm有很多優(yōu)勢(shì),但有有一個(gè)最大的弊端,那就是應(yīng)用程序的定制化能力僅限于預(yù)先存在的配置選項(xiàng)。不僅如此,還得用模板化的方式實(shí)現(xiàn)這些自定義選項(xiàng),非常繁瑣,而Kustomize可以彌補(bǔ)這一劣勢(shì)。
Kustomize
kustomize 是一個(gè)更方便我們基于模版進(jìn)行配置和自定義的工具,允許開發(fā)者將Kubernetes應(yīng)用構(gòu)建分成一系列的層和補(bǔ)丁,并且具有無(wú)限廣闊的定制化能力。
Kustomize使用基于YAML的Kubernetes感知的補(bǔ)丁格式來(lái)添加/刪除/更新應(yīng)用清單的任何部分。Kustomize在1.14版本上已成為了kubectl的一個(gè)組成部分,你所要做的就是執(zhí)行kubectl -k來(lái)調(diào)用它。
簡(jiǎn)單理解,Kustomize是一個(gè)更強(qiáng)大的應(yīng)用工具,它能最大化賦予我們修改Kubernetes應(yīng)用程序的權(quán)限。但同樣,Kustomize也有不足之處,那就是無(wú)形中加大了開發(fā)者的學(xué)習(xí)曲線。另外,無(wú)限制的定制意味著錯(cuò)誤配置應(yīng)用程序的可能性增加。
關(guān)于Kustomize,有一個(gè)使用Helm的新功能,那就是通過(guò)post-render功能來(lái)修補(bǔ)現(xiàn)有的Helm chart缺陷,并且不需要分拆,能讓版本升級(jí)變得更加無(wú)縫。
目前,Kubernetes生態(tài)系統(tǒng)中的許多工具都已經(jīng)嵌入了Kustomize,如ArgoCD、Flux和Kubestack編排和持續(xù)部署工具。如果你搜索類似Kustomize的補(bǔ)丁功能,會(huì)看到很多新功能已經(jīng)存在于你的CD工具中。
尤其作為新手開發(fā)者,如果不熟悉Kubernetes構(gòu)建過(guò)程,就可以考慮使用Kustomize作為一個(gè)獨(dú)立的CLI工具。
Skaffold
創(chuàng)建Kubernetes原生應(yīng)用程序,通常要花很長(zhǎng)的時(shí)間跨注冊(cè)中心構(gòu)建和管理容器映像、手動(dòng)更新Kubernetes清單文件,以及每次進(jìn)行哪怕極小的代碼更改都要重新部署其應(yīng)用程序。如何通過(guò)創(chuàng)建一個(gè)專有工具來(lái)自動(dòng)執(zhí)行這些任務(wù),而不是重復(fù)管理編輯-調(diào)試-部署這樣一個(gè)步驟。于是,Skaffold由此誕生了。
Skaffold遵循DevOps最佳實(shí)踐,即在SDLC中保持開發(fā)環(huán)境和工作流的一致性。Skaffold為開發(fā)者帶來(lái)了工作流和持續(xù)集成(CI)和持續(xù)部署(CD)能力,可以幫助企業(yè)快速構(gòu)建和部署Kubernetes應(yīng)用。
在構(gòu)建部分,Skaffold可以利用Dockerfiles、Buildpacks、Bazel,甚至是自定義腳本,實(shí)現(xiàn)快速構(gòu)建目標(biāo)。而在部署時(shí),基于Skaffold模板引擎,可以調(diào)用kubectl、Helm或Kustomize,實(shí)現(xiàn)應(yīng)用的快速落地。
在2020年,Skaffold團(tuán)隊(duì)專注于各種工作流程的適配,努力其他工具更具互操作性。包括在CI/CD和GitOps方面的能力賦予,以及對(duì)Python和Java提供更好的支持。
此外,Skaffold現(xiàn)在有一個(gè)新的測(cè)試版--skaffold debug。基于新版本應(yīng)用,Skaffold會(huì)嘗試在自動(dòng)配置應(yīng)用程序時(shí)可進(jìn)行遠(yuǎn)程調(diào)試。
總結(jié)
總之,當(dāng)你看到關(guān)于Kubernetes的各種應(yīng)用工具無(wú)從下手時(shí),請(qǐng)不必糾結(jié)。不妨先看看Kubernetes的主流應(yīng)用工具,沒準(zhǔn)已經(jīng)能滿足您的業(yè)務(wù)需求。比如通過(guò)使用Helm,我們可以打包、共享和安裝定義好的Kubernetes應(yīng)用。而使用Kustomize使用補(bǔ)丁,可以修改現(xiàn)有的Kubernetes應(yīng)用。同時(shí),Skaffold也是一個(gè)很受歡迎的工具,可以更好地管理Kubernetes環(huán)境。