一、Helm 是什么?為什么需要它?
K8s 是強大的容器編排平臺,但部署復雜應用時(如包含 Web 服務、數據庫、緩存等多個組件的系統),需要編寫大量 YAML 文件,管理成本高。Helm 就是為簡化 K8s 應用部署而生的工具,它被稱為 “K8s 的包管理器”,類似 Ubuntu 的apt
或 Mac 的brew
。
二、Helm 如何工作?核心概念解析
-
Chart(圖表)
- Helm 的基本單位,是一組 YAML 文件的集合,描述了一個或多個 K8s 資源(如 Deployment、Service、ConfigMap 等)。
- 類比:一個 Chart 就像手機應用商店里的 “APP 安裝包”,包含了應用運行所需的所有組件和配置。
-
Release(發布)
- Chart 的實例化結果。同一個 Chart 可以在集群中部署多次,每次部署都是一個 Release,就像同一 APP 可以在多部手機上安裝,每個安裝都是獨立的。
-
Values(配置值)
- 用于自定義 Chart 的參數。例如,Chart 中定義了數據庫密碼為變量,通過 Values 可以傳入實際密碼,避免硬編碼。
- 類比:安裝 APP 時的 “個性化設置”,如選擇安裝路徑、是否創建桌面圖標等。
三、Helm vs 直接使用 kubectl:優勢在哪?
場景 | 直接用 kubectl | 用 Helm |
---|---|---|
復雜應用部署 | 需要手動編寫 / 管理多個 YAML 文件,易出錯。 | 一鍵安裝預定義的 Chart,自動處理依賴關系。 |
配置管理 | 配置硬編碼在 YAML 中,難以復用和修改。 | 通過 Values 文件靈活配置,支持環境變量。 |
版本控制 | 手動記錄 YAML 變更,回滾困難。 | 自動記錄 Release 歷史,支持一鍵回滾到任意版本。 |
依賴管理 | 需要手動確保組件順序(如先部署 DB 再部署 APP) | Chart 中定義依賴關系,自動按順序部署。 |
四、實戰案例:用 Helm 部署 WordPress
假設你想部署一個 WordPress 博客,包含 Web 服務和 MySQL 數據庫:
- 不用 Helm:需要編寫至少 4 個 YAML 文件(WordPress Deployment、Service,MySQL StatefulSet、PVC),還要處理數據庫初始化、密碼配置等細節。
- 用 Helm:只需一行命令:
bash
helm repo add bitnami https://charts.bitnami.com/bitnami # 添加官方倉庫 helm install my-blog bitnami/wordpress # 安裝WordPress Chart
Helm 會自動:- 創建 MySQL 數據庫并配置持久化存儲;
- 部署 WordPress 應用并連接到數據庫;
- 生成隨機密碼并保存為 Secret;
- 創建 Service 暴露 WordPress 服務。
五、Helm 的進階能力:模板與鉤子
-
模板引擎
- Helm 使用 Go 模板語言,允許在 Chart 中定義動態配置。例如:
# values.yaml replicas: 3# deployment.yaml replicas: {{ .Values.replicas }} # 自動從values中獲取值
- 類比:手機 APP 安裝時的 “自定義選項”,如選擇安裝語言、分辨率等。
- Helm 使用 Go 模板語言,允許在 Chart 中定義動態配置。例如:
-
鉤子(Hooks)
- 允許在特定階段執行自定義操作,如部署前執行數據庫遷移、刪除前備份數據等。
- 類比:手機 APP 安裝前的 “權限申請” 或卸載前的 “數據備份提示”。
一、Helm 安裝準備
1. 安裝 Helm 客戶端
- macOS(使用 Homebrew):
brew install helm
- Linux(使用腳本):
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
- Windows(使用 Chocolatey):
choco install kubernetes-helm
2. 驗證安裝
helm version
# 輸出類似:version.BuildInfo{Version:"v3.12.0", ...}
二、使用 Helm 安裝應用
1. 添加官方倉庫
Helm 通過?倉庫(Repository)?管理 Charts,類似 npm 或 Maven 的倉庫:
helm repo add bitnami https://charts.bitnami.com/bitnami # 添加 Bitnami 官方倉庫
helm repo update # 更新倉庫索引
2. 搜索可用 Charts
helm search repo wordpress # 搜索 WordPress 相關 Charts
# 輸出類似:
# NAME CHART VERSION APP VERSION DESCRIPTION
# bitnami/wordpress 15.0.0 6.2.2 WordPress is the world's most popular blogging ...
3. 安裝 Chart
以安裝 WordPress 為例:
helm install my-blog bitnami/wordpress # 安裝名為 my-blog 的 WordPress 實例
- 關鍵參數:
--version 15.0.0
:指定 Chart 版本--values my-values.yaml
:使用自定義配置文件--set service.type=LoadBalancer
:臨時覆蓋配置值
4. 查看安裝狀態
helm list # 查看所有已安裝的 Releases
helm status my-blog # 查看特定 Release 的詳細信息
kubectl get pods # 驗證 Pod 是否正常運行
三、自定義配置(Values 文件)
1. 創建自定義 Values 文件
復制默認配置并修改:
helm show values bitnami/wordpress > my-values.yaml
vi my-values.yaml # 編輯配置,例如修改數據庫密碼、服務類型等
2. 使用自定義配置安裝
bash
helm install my-blog bitnami/wordpress -f my-values.yaml
3. 常見配置示例
# my-values.yaml
wordpressUsername: admin
wordpressPassword: my-strong-password # 自定義 WordPress 密碼
service:type: NodePort # 將服務類型改為 NodePort
persistence:size: 20Gi # 增加持久化存儲大小
四、升級與回滾應用
1. 升級應用
helm upgrade my-blog bitnami/wordpress --set wordpressPassword=new-password # 升級并修改密碼
2. 查看歷史版本
helm history my-blog
# 輸出類似:
# REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
# 1 Mon Jul 10 12:00:00 2023 superseded wordpress-15.0.0 6.2.2 Install complete
# 2 Mon Jul 10 12:30:00 2023 deployed wordpress-15.1.0 6.2.2 Upgrade complete
3. 回滾到指定版本
helm rollback my-blog 1 # 回滾到版本 1
五、管理 Helm 倉庫
1. 添加自定義倉庫
helm repo add my-repo https://my-company.com/charts
2. 查看已添加的倉庫
helm repo list
3. 更新倉庫索引
helm repo update # 每次使用前建議更新
六、創建自己的 Chart
1. 初始化 Chart 項目
helm create my-app # 創建名為 my-app 的 Chart 模板
2. Chart 目錄結構
my-app/
├── charts/ # 依賴的子 Charts
├── templates/ # YAML 模板文件
│ ├── deployment.yaml
│ ├── service.yaml
│ └── _helpers.tpl # 模板輔助函數
├── Chart.yaml # Chart 元數據(名稱、版本等)
└── values.yaml # 默認配置值
3. 編寫模板(示例)
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: {{ .Release.Name }}-app
spec:replicas: {{ .Values.replicas }} # 從 values.yaml 獲取副本數selector:matchLabels:app: {{ .Release.Name }}template:metadata:labels:app: {{ .Release.Name }}spec:containers:- name: {{ .Chart.Name }}image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"ports:- containerPort: {{ .Values.service.port }}
4. 打包 Chart
helm package my-app # 生成 my-app-0.1.0.tgz 包
5. 安裝本地 Chart
helm install my-release ./my-app
七、常用 Helm 命令速查表
命令 | 作用 |
---|---|
helm install release chart | 安裝 Chart 為一個 Release |
helm upgrade release chart | 升級 Release |
helm uninstall release | 卸載 Release |
helm search repo keyword | 在倉庫中搜索 Chart |
helm show values chart | 查看 Chart 的默認配置值 |
helm dependency update chart | 更新 Chart 的依賴 |
helm lint chart | 檢查 Chart 語法錯誤 |
helm template chart | 渲染 Chart 模板(不安裝) |
八、最佳實踐
- 使用 Values 文件:避免在命令行中使用大量?
--set
?參數,將配置保存在文件中便于版本控制。 - 命名規范:Release 名稱和 Chart 名稱保持語義化(如?
my-prod-api
)。 - 版本控制:將自定義 Values 文件和 Chart 代碼納入 Git 管理。
- 測試先行:使用?
helm install --dry-run
?預渲染模板,確保配置正確。 - 清理不再使用的 Releases:定期?
helm uninstall
?不再需要的應用。
總結:Helm 是 K8s 的 “應用增強器”
- Helm 的定位:簡化 K8s 應用的部署、升級和管理,尤其適合復雜的分布式系統。
- 與 K8s 的關系:K8s 提供容器編排能力,Helm 提供應用層面的封裝和管理,二者結合就像 “操作系統”+“應用商店”,讓用戶更高效地使用 K8s。
通過 Helm,開發者可以將精力集中在業務邏輯上,而不是復雜的 K8s 配置,真正實現 “一鍵部署,全家無憂”!