天天看點

Helm, 在 Kubernetes 中部署應用的利器

背景

kubernetes(k8s)是一個基于容器技術的分布式架構領先方案。它在 docker 技術的基礎上,為容器化的應用提供部署運作、資源排程、服務發現和動态伸縮等一系列完整功能,提高了大規模容器叢集管理的便捷性。

在容器雲環境及容器化服務在業界開始大規模部署應用的前提下,kubernetes 在業界的實際應用情況又是怎樣的呢?在今年召開的 jfrog swampup 使用者大會上,codefresh 公司為大家展示了一些有意思的資料。如下圖:

Helm, 在 Kubernetes 中部署應用的利器

據 codefresh 公司統計,在目前 jfrog 的企業使用者當中,有80%已經使用了 kubernetes,這說明 kubernetes 已經得到了業界的認可并開始了廣泛的應用。然而,隻有5%的 jfrog 使用者在生産環境中使用 kubernetes。也就是說,企業更多的隻是在自己的研發、測試環境中去使用  kubernetes。這是什麼原因呢?jfrog 通過自身在 kubernetes 應用上的大量實踐證明,“kubernetes is hard”,直接使用 kubernetes 去部署和管理容器化的雲服務,尤其是基于微服務的雲服務,是非常具有挑戰性的工作。

那如何才能更便捷地應用 kubernetes 呢?jfrog 選擇了 helm,kubernetes 的官方包管理工具。我們再來看 codefresh 提供的另一組資料,如下圖:

Helm, 在 Kubernetes 中部署應用的利器

和上一組資料一樣,隻有5%的 jfrog 企業使用者在生産環境使用了 kubernetes。但同時,也有5%的 jfrog 使用者使用了 helm。可見,當把 kubernetes 應用到生産環境的時候,衆多企業也和 jfrog 一樣,選擇了 helm 這一“利器”。

為什麼 helm 會受到這樣的青睐?本文将通過 jfrog 實施 helm 和 kubernetes 的實踐來介紹和分析 helm 的優勢所在。

helm 是什麼

在介紹 helm 之前,我們先來看看直接應用 kubernetes 部署雲服務會遇到哪些困難。

Helm, 在 Kubernetes 中部署應用的利器

kubernetes 使用 yaml 檔案來描述和管理服務中各個元件的配置和部署需求,每個元件對應一個 yaml 檔案。當下的雲服務通常都是由多個元件構成的,如何配置和處理好這些元件,也就是多個 yaml 檔案之間的關聯關系,成為了 kubernetes 應用的額外任務。而當雲服務更新,卻僅僅涉及其中一個或某幾個子產品時,更新子產品的新 yaml 檔案和已有 yaml 檔案之間的關聯關系就會變得更加錯綜複雜,進而更增加了使用 kubernetes 來配置和管理更新的難度。

其次,kubernetes 把元件的配置資訊也直接記錄到 yaml 檔案當中。從描述元件的角度來講,這種方式确實比較清晰。但是,當雲服務的部署面對多個環境,如不同的開發、測試、産品環境(這也是目前比較常見的應用場景)時,要如何處理這些環境配置之間的差别?要為每個環境都開發和維護一套不同的 yaml 檔案?這顯然大大增加了應用 kubernetes 的難度和工作量。

而且,kubernetes 的 yaml 檔案本身是沒有版本的概念的。那麼當某次部署失敗,需要復原到上一個穩定版本時,該選擇哪一套 yaml 檔案來處理?顯然,這需要很多額外的工作來處理。

那 helm 是如何來解決這些問題的呢?

Helm, 在 Kubernetes 中部署應用的利器

helm(https://helm.sh)是  kubernetes的官方包管理工具。helm 是通過被稱作 helm chart 的包來描述和管理雲服務的。helm chart 對應的是一組結構化的目錄和 yaml 檔案,而這些目錄和檔案大緻可分為三個部分:

Helm, 在 Kubernetes 中部署應用的利器

模闆

在 templates 目錄下存放着一組用來描述雲服務當中各個元件的 yaml 檔案,這和目前 kubernetes 的用法類似。helm 把這些 yaml 檔案組織在同一目錄,能夠很友善地了解目前雲服務的組成,結構清晰且便于管理。

配置與依賴

templates 目錄下的 yaml 檔案是不包含具體的配置資訊的,隻保留了對配置項(key)的引用。真正與目标環境對應的配置資訊(value)是存儲在 values.yaml 檔案裡的。當然,values.yaml 隻是存儲了一些預設的、靜态的配置資訊,在部署的過程中也可以動态地增加或修改這些配置資訊。這種配置與應用分離的設計使得同一套 templates 可以友善地部署到不同的目标環境中,隻需要更新 values.yaml 檔案或部署時動态修改配置資訊就可以了。

另外,針對某些已被廣泛使用的雲服務或元件,目前已經存在比較成熟、經過驗證的 helm chart 了。當使用到這些服務或元件時,可以直接在 requirements.yaml 檔案裡描述這種依賴關系。在部署的時候,helm 會自動擷取這些依賴的 helm chart 使用,并存儲在 charts 目錄。這種依賴性的設計,避免了很多重複性的工作,也使得 helm chart 的并行開發和共享成為可能。

Helm, 在 Kubernetes 中部署應用的利器

版本化

每一個 helm chart 包都可以在 chart.yaml 檔案裡定義自己的版本。另外,每一次 helm 的部署都會自動生成一個版本(release)。使用 helm 的指令,可以友善地實作這些已部署版本的查詢、更新、復原和其他管理任務。

helm 的應用實踐

通過上面對 helm 的介紹和分析可以看出,helm 能夠很好地解決 kubernetes 應用部署的難題。jfrog 在自己的 kubernetes 實踐當中也充分使用了 helm。

Helm, 在 Kubernetes 中部署應用的利器

目前,在 jfrog 各個産品自身的 ci/cd 流水線上都使用 helm 進行 kubernetes 上的部署,已經可以實作每周100+不同産品線的任意版本組合部署,每次部署超過50種微服務。jfrog 也将為客戶提供這些 helm chart,以幫助客戶在 kubernetes 環境快速部署 jfrog 的各種産品。

在實踐 helm 的過程中,jfrog 也積累了一些經驗和最佳實踐。

Helm, 在 Kubernetes 中部署應用的利器

配置與應用分離

針對所有的環境使用同樣的 helm chart,但是根據不同的環境配置自己特定的 values.yaml 檔案。同時,根據目标環境的變化對這些 values.yaml 檔案進行版本化的管理。

善用依賴

目前已經有很多産品和通用元件都實作了比較完善、經過驗證的 helm chart,可以在https://hub.kubeapps.com  裡找到。我們在開發自己的 helm chart 時,可以通過定義依賴來充分地利用這些已有的成果,在減少工作量的同時,也能提高産品的品質。

Helm, 在 Kubernetes 中部署應用的利器

在實際部署前檢查 helm chart

helm 提供了很多實用的指令來幫助我們在實際部署之前檢查 helm chart 裡的錯誤,降低使用的風險。比如:

Helm, 在 Kubernetes 中部署應用的利器

helm lint <chart path>

helm lint 可以用來檢查下載下傳的 helm chart 是否存在問題

helm install –debug –dry-run <chart>

helm install 帶上 dry-run 參數可以在不實際執行部署的情況下檢查 helm chart 的各種配置是否正确

helm 的各種指令及其具體用法請參考 helm 的官方文檔,https://docs.helm.sh。

充分利用社群的力量

目前有很多開發者都在研究和實踐 helm,我們應該充分利用他們的經驗和成果,并積極地和他們溝通交流,進而提升我們使用 helm 的效率和品質。

Helm, 在 Kubernetes 中部署應用的利器

常用的用于 helm 交流的社群包括:

github issues:

https://github.com/helm/charts/issues

slack: #helm-users room in the kubernetes slack(https://kubernetes.slack.com/)

slack: #helm-dev room in the kubernetes slack(https://kubernetes.slack.com/)

helm 倉庫

下圖是 helm 的應用架構:

Helm, 在 Kubernetes 中部署應用的利器

其中,tiller 部署在 kubernetes 環境中,執行應用部署等操作。而 helm 作為用戶端,完成 helm chart 的管理和部署任務的釋出。在這個架構中,helm 倉庫(storage)儲存了 helm 部署所需要的各種 chart 檔案、依賴包和配置資訊,在 helm 部署過程中起到了十分重要的作用。

jfrog 的 artifactory 産品,作為全球唯一提供 helm 倉庫支援的統一制品管理倉庫,可以在為 helm chart 提供倉庫支援的同時,為相關制品,如 docker 鏡像、版本化的配置資訊,以及各種依賴制品等提供一站式的統一服務和管理。而 jfrog 的 xray 産品,內建 artifactory 的統一制品倉庫,能夠實作安全漏洞的自動掃描及漏洞的影響範圍分析。

Helm, 在 Kubernetes 中部署應用的利器

有關 jfrog 産品的詳細介紹、能力分析及使用者案例,請參考本公衆号的系列文章和官網的相關介紹(http://jfrogchina.com)。

 總結

通過 kubernetes 部署雲服務已經在業界的到了廣泛的應用。helm 通過其統一管理、配置與應用分離、版本化等特性能夠大大降低 kubernetes 部署的難度,提升部署的效率和品質,也逐漸得到了衆多的關注和應用。

jfrog 的 artifactory 和 xray 等産品能夠提供包含 helm 倉庫在内的統一制品倉庫管理和安全漏洞掃描,在實作基于 helm 的 ci/cd 流水線和自動化部署方案起到了重要的作用。codefresh 公司就利用 jfrog 的産品和相關工具搭建了自己産品的流水線并廣泛使用。

Helm, 在 Kubernetes 中部署應用的利器