一、背景
? ? ? ? 官網:??https://helm.sh/
? ? ? ? 我們針對K8S環境中,部署對應的應用,無外乎就是編寫一堆yaml資源清單文件. 資源清單、依賴性少的時候,可以直接手動維護。但是,隨著資源清單越來越復雜,越來越多,不同的環境切換不同的資源清單配置,如果還是手動維護,那將會是一場運維災難。
?????????沒有Helm之前的問題:?
? ? ? ? ? ? ? ? 1、手動管理YAML文件:需要手動編寫和維護大量YAML文件,容易出錯
? ? ? ? ? ? ? ? 2、缺乏標準化:各團隊有自己的部署方式,難以統一管理
? ? ? ? ? ? ? ? 3、部署流程復雜:需要按特定順序創建資源,容易遺漏步驟
? ? ? ? ? ? ? ? 4、環境差異處理困難:不同環境的配置需要手動修改或維護多套文件
? ? ? ? ? ? ? ? 5、回滾機制不完善:需要手動記錄變更并反向操作才能回滾
????????Helm 是 Kubernetes 的包管理工具,相當于 Linux 系統中的 apt/yum 或 macOS 中的 homebrew。它通過將 Kubernetes 應用打包成可復用的單元(稱為 Chart),簡化了復雜應用的部署和管理流程。
? ? ? ? Helm的核心原理就是:? 使用go template模板語法,嵌入到K8S的資源清單yaml文件中,為yaml資源清單文件提供了動態編程能力的工具,動態生成最終部署的yaml清單文件。? 并且還支持了repo倉庫機制生態、依賴聲明等功能。
????????在Kubernetes生態系統中,Helm的出現主要解決了以下幾個核心問題:
? ? ? ? ? ? ? ? 1、應用管理的復雜性:Kubernetes原生資源文件(YAML)在管理復雜應用時變得冗長且難以維護,特別是當應用由多個組件組成時。
? ? ? ? ? ? ? ? 2、配置管理的挑戰:沒有標準化的方式來管理不同環境的配置(開發、測試、生產),導致大量重復或輕微修改的YAML文件。
? ? ? ? ? ? ? ? 3、版本控制的缺失:缺乏應用級別的版本控制機制,難以回滾到特定版本。
? ? ? ? ? ? ? ? 4、共享和復用困難:沒有統一的方式打包和共享Kubernetes應用模板,各團隊重復造輪子。
二、Helm核心概念
1、Chart
????????Chart是Helm的應用打包格式,包含了一組Kubernetes資源文件的模板和配置。Chart的結構如下:
mychart/Chart.yaml # Chart的元數據文件values.yaml # 默認配置值charts/ # 依賴的子Charttemplates/ # 模板目錄deployment.yaml # 部署模板service.yaml # 服務模板... # 其他Kubernetes資源模板
? ? ? ? 類比docker里面的鏡像image。?
2、Release
????????Release是Chart在Kubernetes集群中的一次部署實例。同一個Chart可以多次安裝到同一集群,每次安裝都會創建一個新的Release。
? ? ? ? 類比docker當做的容器。 同一個namespace只能部署唯一名稱的release, release名稱不同,則可以部署多個不同的release。? (除非nodeport等端口沖突)
3、Repository (Repo)
????????Chart倉庫是存放和共享Chart的地方。Helm客戶端可以連接多個倉庫來查找和下載Chart。
? ? ? ? 類比docker當中的鏡像倉庫, Chart也有自己的倉庫進行存儲,方便分發、拉取。
三、Helm常用命令
1. Chart相關命令
# 創建新Chart
helm create mychart# 打包Chart
helm package mychart# 檢查Chart語法
helm lint mychart# 查看Chart模板渲染結果(不實際部署)
helm template mychart# 驗證Chart是否安裝成功(dry-run模式)
helm install --dry-run myrelease mychart
2. Repository相關命令?
# 添加Chart倉庫
helm repo add bitnami https://charts.bitnami.com/bitnami# 列出已配置的倉庫
helm repo list# 更新本地倉庫緩存
helm repo update# 搜索Chart
helm search repo nginx# 移除倉庫
helm repo remove bitnami
3. Release相關命令
# 安裝Release
helm install myrelease mychart# 列出已安裝的Release
helm list# 查看Release狀態
helm status myrelease# 升級Release
helm upgrade myrelease mychart# 回滾Release
helm rollback myrelease 1# 卸載Release
helm uninstall myrelease# 查看Release歷史
helm history myrelease
四、實戰示例
1、創建并部署一個簡單的Chart
# 創建新Chart
helm create myapp# 編輯Chart配置
cd myapp
vim values.yaml # 修改副本數、鏡像等配置# 安裝Chart
helm install myapp-release ./myapp# 檢查部署狀態
kubectl get pods
helm status myapp-release
?2、使用外部Chart部署應用
# 添加bitnami倉庫
helm repo add bitnami https://charts.bitnami.com/bitnami# 搜索nginx Chart
helm search repo nginx# 安裝nginx
helm install my-nginx bitnami/nginx# 自定義配置安裝
helm install my-nginx bitnami/nginx --set service.type=LoadBalancer,replicaCount=2
?3、高級配置示例
創建自定義values.yaml:
# custom-values.yaml
replicaCount: 3
image:repository: nginxtag: "1.21.0"pullPolicy: IfNotPresent
service:type: NodePortport: 80
然后使用自定義值安裝:
helm install -f custom-values.yaml my-nginx bitnami/nginx
4、最佳實踐
-
版本控制:將Chart和values文件納入版本控制系統
-
環境分離:為不同環境(dev/staging/prod)維護不同的values文件
-
模板測試:使用
helm template
和--dry-run
測試模板渲染 -
依賴管理:明確聲明Chart依賴關系
-
安全實踐:只使用可信的Chart倉庫,審查第三方Chart
-
資源命名:使用
.Release.Name
作為資源名前綴確保唯一性 -
配置默認值:為模板參數提供合理的默認值
五、總結
????????Helm作為Kubernetes的包管理器,極大地簡化了復雜應用的部署和管理。通過模板化、版本控制和依賴管理等特性,Helm為Kubernetes應用提供了類似于Linux包管理工具的體驗。掌握Helm不僅可以提高部署效率,還能實現配置的標準化和可重復性,是Kubernetes生態中不可或缺的工具。?
? ? ? ? 可以方便我們直接部署和使用,也可以支持快速安裝、快速回滾。
? ? ? ? 核心原理:
????????使用go template模板語法,嵌入到K8S的資源清單yaml文件中,為yaml資源清單文件提供了動態編程能力的工具,動態生成最終部署的yaml清單文件。? 并且還支持了repo倉庫機制生態、依賴聲明等功能。