什么是Helm
微服務和容器化給復雜應用部署與管理帶來了極大的挑戰。Helm是目前Kubernetes服務編排領域的唯一開源子項目,作為Kubernetes應用的一個包管理工具,可理解為Kubernetes的apt-get / yum,由Deis 公司發起,該公司已經被微軟收購。Helm通過軟件打包的形式,支持發布的版本管理和控制,很大程度上簡化了Kubernetes應用部署和管理的復雜性。
隨着業務容器化與向微服務架構轉變,通過分解巨大的單體應用為多個服務的方式,分解了單體應用的復雜性,使每個微服務都可以獨立部署和擴展,實現了敏捷開發和快速迭代和部署。但任何事情都有兩面性,雖然微服務給我們帶來了很多便利,但由於應用被拆分成多個組件,導致服務數量大幅增加,對於Kubernetest編排來說,每個組件有自己的資源文件,並且可以獨立的部署與伸縮,這給采用Kubernetes做應用編排帶來了諸多挑戰:
- 管理、編輯與更新大量的K8s配置文件
- 部署一個含有大量配置文件的復雜K8s應用
- 分享和復用K8s配置和應用
- 參數化配置模板支持多個環境
- 管理應用的發布:回滾、diff和查看發布歷史
- 控制一個部署周期中的某一些環節
- 發布后的驗證
Helm把Kubernetes資源(比如deployments、services或 ingress等) 打包到一個chart中,而chart被保存到chart倉庫。通過chart倉庫可用來存儲和分享chart。Helm使發布可配置,支持發布應用配置的版本管理,簡化了Kubernetes部署應用的版本控制、打包、發布、刪除、更新等操作。
Helm解決的問題
利用Kubernetes部署一個應用,需要Kubernetes原生資源文件如deployment、replicationcontroller、service或pod 等。而對於一個復雜的應用,會有很多類似上面的資源描述文件,如果有更新或回滾應用的需求,可能要修改和維護所涉及的大量資源文件,且由於缺少對發布過的應用版本管理和控制,使Kubernetes上的應用維護和更新等面臨諸多的挑戰,而Helm可以幫我們解決這些問題。
Helm原理
Helm架構
Helm功能
作為Kubernetes的一個包管理工具,Helm具有如下功能:
- 創建新的chart
- chart打包成tgz格式
- 上傳chart到chart倉庫或從倉庫中下載chart
- 在Kubernetes集群中安裝或卸載chart
- 管理用Helm安裝的chart的發布周期
Helm三個重要概念
- chart:包含了創建Kubernetes的一個應用實例的必要信息
- config:包含了應用發布配置信息
- release:是一個chart及其配置的一個運行實例
Helm組件
Helm有兩部分組成:
- Helm Client
- Tiller Server
簡單的說,client管理charts,而server管理發布release。
Helm Client
Helm Client是用戶命令行工具,其主要負責如下:
- 本地chart開發
- 倉庫管理
- 與Tiller sever交互
- 發送預安裝的chart
- 查詢release信息
- 要求升級或卸載已存在的release
Tiller Server
Tiller Server是一個部署在Kubernetes集群內部的server,其與Helm client、Kubernetes API server進行交互。Tiller server主要負責如下:
- 監聽來自Helm client的請求
- 通過chart及其配置構建一次發布
- 安裝chart到Kubernetes集群,並跟蹤隨后的發布
- 通過與Kubernetes交互升級或卸載chart
Helm實現
- Helm client采用go語言編寫,采用gRPC協議與Tiller server交互。
- Tiller server也同樣采用go語言編寫,提供了gRPC server與client進行交互,利用Kubernetes client 庫與Kubernetes進行通信,當前庫使用了REST+JSON格式。
- Tiller server 沒有自己的數據庫,目前使用Kubernetes的ConfigMaps存儲相關信息