Kubernetes Helm 套件管理工具

在 Linux 上我們用 aptyum 來安裝軟體。 在 Kubernetes 上,我們用 Helm

為什麼需要 Helm?

一個複雜的應用程式 (如 WordPress) 在 K8s 上部署時,可能包含:

  1. Deployment: 網頁伺服器
  2. StatefulSet: 資料庫 (MariaDB)
  3. Service: 負載平衡
  4. Secret: 資料庫密碼
  5. ConfigMap: 網頁設定檔
  6. Ingress: 網域名稱與 TLS

如果沒有 Helm,你需要手動管理這 6 個 YAML 檔案。如果你想部署第二套 (例如測試環境),你需要複製這 6 個檔案並手動修改所有名稱和 IP,這非常容易出錯且難以維護。

Helm 的解決方案:

  • Templating (樣板化): 將 YAML 中的變數 (如 Image Tag, Replica Count) 抽離出來,變成模板。
  • Packaging (打包): 將一整組 YAML 打包成一個 Chart (.tgz)。
  • Versioning (版本控制): 支援應用程式的版本管理與回滾 (Rollback)。

Helm 三大核心概念

  1. Chart: 軟體包 (類似 Docker Image 或 deb/rpm)。包含了一堆 YAML 模板與預設參數。
  2. Repository (Repo): 存放 Charts 的倉庫 (類似 Docker Hub)。
  3. 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 (不安裝)
Linthelm lint <path>檢查 Chart 語法錯誤

總結

  1. 不要重造輪子: 在寫 YAML 之前,先去 Artifact Hub 搜尋有沒有現成的 Helm Chart。
  2. 管理複雜度: 使用 Helm 可以有效管理多環境 (Dev/Staging/Prod) 的差異配置。
  3. 版本控制: 所有的更動都有歷史紀錄,隨時可以 Rollback,增加了維運的安全性。