在過去幾天的學習中,我們每部署一個稍微完整的服務,都需要手動撰寫或複製一堆 YAML 檔:
deployment.yaml
service.yaml
ingress.yaml
configmap.yaml
secret.yaml
pvc.yaml
當專案規模變大時,純 YAML 會帶來以下巨大痛點:
kubectl apply 幾十份別人的 YAML,版本升級或解除安裝時更是惡夢。Helm 就是為了解決這些問題而生的「Kubernetes 套件管理器(Package Manager)」。
你可以把 Helm 直接類比成 Linux 的 apt、yum 或是 Mac 的 Homebrew:
| Helm 概念 | 角色比喻 | 實體內容說明 |
|---|---|---|
| Chart | 軟體安裝包(Recipe) | 一個包含了一組 K8s YAML 樣板(Templates)與預設設定檔的資料夾或壓縮檔。 |
| Repository | 應用程式商店 / 軟體源 | 存放與分享各種 Charts 的遠端倉庫(例如 Artifact Hub 或 GitHub Pages)。 |
| Release | 已安裝的軟體實例 | 當你在 K8s 集群中把一個 Chart 安裝跑起來後,該運行實例就稱為一個 Release。 |
一個標準的 Helm Chart 目錄大致如下:
my-chart/
├── Chart.yaml # 定義 Chart 的元資料(名稱、版本號、描述)
├── values.yaml # 存放所有可供客製化調整的預設變數值
└── templates/ # K8s YAML 樣板目錄(使用 Go Template 語法)
├── deployment.yaml
├── service.yaml
└── _helpers.tpl
templates/ 底下的 YAML 不會寫死硬編碼(Hardcoded)的數值,而是用 {{ .Values.replicaCount }} 這樣的變數代替。當執行安裝時,Helm 會自動拿 values.yaml 裡的數值去填滿這些樣板,生成最終的 K8s 資源!在本地終端機安裝 Helm 命令列工具:
brew install helm
choco install kubernetes-helm
驗證安裝版本:
helm version
我們新增社群中最知名的 Bitnami 開源應用倉庫:
# 新增 bitnami 倉庫
helm repo add bitnami [https://charts.bitnami.com/bitnami](https://charts.bitnami.com/bitnami)
# 更新本地倉庫索引
helm repo update
搜尋倉庫中可用的 Chart(例如搜尋 Nginx):
helm search repo nginx
我們透過 Bitnami 的 Nginx Chart,在集群中安裝一個名為 my-web 的 Release:
helm install my-web bitnami/nginx
輸出預期:
NAME: my-web
LAST DEPLOYED: ...
NAMESPACE: default
STATUS: deployed
REVISION: 1
Helm 會自動幫我們建立好 Deployment、Service、ConfigMap 與 Secret,完全不需要我們手寫一行 YAML!
查看當前集群中由 Helm 管理的 Release 列表:
helm list
如果我們想把副本數擴展為 2,並不需要手動去改 Deployment。可以直接透過 --set 參數覆寫 values.yaml 中的設定:
helm upgrade my-web bitnami/nginx --set replicaCount=2
檢查 Pod 數量:
kubectl get pods -l app.kubernetes.io/name=nginx
你會發現 Pod 已經被平滑擴展為 2 個副本!
查看這個 Release 的升級歷史:
helm history my-web
可以看到目前處於 REVISION: 2。如果升級後發現問題,同樣可以使用 helm rollback my-web 1 瞬間退回版本 1。
當不再需要這個應用時,只需一行指令即可乾淨清空所有相關資源:
helm uninstall my-web
今天我們解鎖了 Kubernetes 生態系中最不可或缺的管理神器 Helm:
掌握了 Helm 的基本操作後,明天 Day 21,我們要迎來第三週的整合大實作:「【實作】用 Helm 一鍵部署並客製化 WordPress + MySQL 集群」!