Kubernetes Helm 套件管理工具
在 Linux 上我們用 apt 或 yum 來安裝軟體。
在 Kubernetes 上,我們用 Helm。
為什麼需要 Helm?
一個複雜的應用程式 (如 WordPress) 在 K8s 上部署時,可能包含:
- Deployment: 網頁伺服器
- StatefulSet: 資料庫 (MariaDB)
- Service: 負載平衡
- Secret: 資料庫密碼
- ConfigMap: 網頁設定檔
- Ingress: 網域名稱與 TLS
如果沒有 Helm,你需要手動管理這 6 個 YAML 檔案。如果你想部署第二套 (例如測試環境),你需要複製這 6 個檔案並手動修改所有名稱和 IP,這非常容易出錯且難以維護。
Helm 的解決方案:
- Templating (樣板化): 將 YAML 中的變數 (如 Image Tag, Replica Count) 抽離出來,變成模板。
- Packaging (打包): 將一整組 YAML 打包成一個 Chart (.tgz)。
- Versioning (版本控制): 支援應用程式的版本管理與回滾 (Rollback)。
Helm 三大核心概念
- Chart: 軟體包 (類似 Docker Image 或 deb/rpm)。包含了一堆 YAML 模板與預設參數。
- Repository (Repo): 存放 Charts 的倉庫 (類似 Docker Hub)。
- Release: Chart 被安裝到叢集中後的執行實例。同一個 Chart 可以被安裝很多次 (e.g.,
mysql-dev,mysql-prod),每一次都是一個 Release。
安裝 Helm
macOS
brew install helm
Linux / Windows
請參考 Helm 官方安裝文件,通常只是一個 binary 執行檔,下載放到 PATH 即可。
實戰:安裝 Bitnami MySQL
不需要自己寫 StatefulSet YAML,直接用現成的!
1. 新增 Repo
Helm 預設沒有任何 Repo,我們需要先加入常用的 (如 Bitnami):
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
2. 搜尋 Chart
helm search repo mysql
# NAME CHART VERSION APP VERSION DESCRIPTION
# bitnami/mysql 11.1.0 8.0.33 Chart to deploy MySQL...
3. 安裝 (Install) - 建立 Release
# 格式: helm install <release-name> <chart-name>
helm install my-db bitnami/mysql
安裝完 helm 會噴出一堆 NOTES,告訴你怎麼取得 root 密碼、怎麼連線。這比自己寫 YAML 快多了!
4. 自定義參數 (Values)
每個 Chart 都有預設的參數 (Values)。我們可以透過兩種方式覆蓋它:
方法 A: 使用 --set (適合少量修改)
helm install my-blog bitnami/wordpress \
--set wordpressUsername=admin \
--set wordpressPassword=password123
方法 B: 使用 values.yaml (推薦)
先匯出預設參數檔:
helm show values bitnami/mysql > values.yaml
編輯 values.yaml 後,用 -f 參數安裝:
helm install my-db bitnami/mysql -f values.yaml
5. 升級 (Upgrade) 與 回滾 (Rollback)
當應用程式需要更新 (例如改 Image Tag 或改 Config) 時:
# 更新 Release
helm upgrade my-db bitnami/mysql -f values.yaml
搞砸了?Helm 支援原子性 (Atomic) 回滾:
# 查看歷史版本
helm history my-db
# 回滾到版本 1
helm rollback my-db 1
6. 解除安裝 (Uninstall)
helm uninstall my-db
深入 Chart 結構
當你執行 helm create my-chart 時,會產生以下標準結構:
my-chart/
├── Chart.yaml # Chart 的 Metadata (名稱、版本、描述)
├── values.yaml # 預設變數檔 (這裡定義的變數可在 templates 中使用)
├── charts/ # 依賴的其他 Chart (Dependencies)
└── templates/ # 存放 K8s YAML 模板的地方
├── deployment.yaml
├── service.yaml
├── _helpers.tpl # 定義共用的樣板函式 (Named Templates)
└── NOTES.txt # 安裝後顯示的提示訊息
模板語法範例 (Go Template)
在 templates/deployment.yaml 中,我們不再寫死參數,而是用 {{ .Values.key }}:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-server # 使用 Release 名稱作為前綴
spec:
replicas: {{ .Values.replicaCount }} # 讀取 values.yaml 的 replicaCount
template:
spec:
containers:
- name: nginx
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
對應的 values.yaml:
replicaCount: 3
image:
repository: nginx
tag: stable
當你執行 helm install 時,Helm 引擎會將 values.yaml 的值填入 templates/*.yaml,最後生成標準的 K8s YAML 並丟給 API Server。
常用指令速查表 (Cheat Sheet)
| 動作 | 指令 | 說明 |
|---|---|---|
| 新增倉庫 | helm repo add <name> <url> | 加入 Chart 來源 |
| 更新倉庫 | helm repo update | 更新本地的 Chart 索引 |
| 搜尋 | helm search repo <keyword> | 搜尋可用的 Chart |
| 安裝 | helm install <name> <chart> | 部署應用程式 (Release) |
| 列出 | helm list (helm ls) | 查看已安裝的 Releases |
| 狀態 | helm status <name> | 查看 Release 詳細狀態與 Notes |
| 升級 | helm upgrade <name> <chart> | 更新 Release 設定 |
| 回滾 | helm rollback <name> <revision> | 退版 |
| 移除 | helm uninstall <name> | 刪除應用程式 |
| 除錯 | helm template <chart> | 試跑並印出生成的 YAML (不安裝) |
| Lint | helm lint <path> | 檢查 Chart 語法錯誤 |
總結
- 不要重造輪子: 在寫 YAML 之前,先去 Artifact Hub 搜尋有沒有現成的 Helm Chart。
- 管理複雜度: 使用 Helm 可以有效管理多環境 (Dev/Staging/Prod) 的差異配置。
- 版本控制: 所有的更動都有歷史紀錄,隨時可以 Rollback,增加了維運的安全性。