K8s | Helm
What is Helm?
Helm 是 Kubernetes 的「套件管理工具」,可協助你:
- 安裝複雜應用程式(如 WordPress、MySQL、Prometheus)
- 管理部署版本與參數設定
- 執行升級(upgrade)、回滾(rollback)、移除(uninstall)等操作
Helm 將應用打包成一個「Chart」,其中包含:
- Kubernetes YAML 模板(template)
- 預設變數設定檔
values.yaml
- 說明檔與 Chart metadata(如
Chart.yaml
)
Basic Helm Commands
Artifact HUB is a web-based application that enables finding, installing, and publishing Cloud Native packages.
範例:安裝 WordPress
1 | # 新增套件來源並更新 |
其他常用命令
Chart Repository 操作
1 | helm repo list # 查看已加入的 repository |
Release 安裝與管理
1 | helm install <release-name> <chart> # 安裝 release |
查詢與除錯
1 | helm get all <release-name> # 查看 release 詳細內容 |
幫助與文件
1 | helm --help |
Installation
Helm 官方教學
你也可以使用 get_helm.sh script 在任何支援 bash 的系統上安裝。
- 確保已安裝並啟動 K8s Cluster,可使用
kubeadm
部署 - 驗證
kubectl
、kubeadm
、helm
版本1
2kubectl version
kubeadm version - 安裝 Helm 3(適用 Linux/macOS)
1
2
3
4
5curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
helm version
必要工具安裝
若要使用 Helm,你必須先準備好 Kubernetes Cluster,而 kubectl 和 kubeadm 是協助你「建立」或「連線」這個 Cluster 的工具。
工具 | 角色 | 是否必要 | 說明 |
---|---|---|---|
kubeadm |
用來建立 K8s Cluster 的工具 | ❌可選 | 你若使用 EKS、GKE、Minikube 就不需要它 |
kubectl |
與 K8s 溝通的 CLI 工具 | ✅必要 | Helm 執行時會使用 kubectl 與 API Server 對話 |
helm |
K8s 應用套件管理器(需要 kube + kubectl) | ✅必要 | 安裝 chart、升級、回滾、解除安裝等功能 |
✅ 正確順序:
- (可選)安裝
kubeadm
- → 如果你是自己在本機或 VM 建立 K8s Cluster,就需要
kubeadm
來初始化。
- → 如果你是自己在本機或 VM 建立 K8s Cluster,就需要
- 建立 Kubernetes Cluster
- → 使用
kubeadm init
或其他方式(如 Minikube、Kind、EKS/GKE)建立一個運作中的叢集。
- → 使用
- 安裝與設定
kubectl
- → 用來與你的 K8s Cluster 溝通,必須設定
~/.kube/config
指向正確的 Cluster。
- → 用來與你的 K8s Cluster 溝通,必須設定
- 驗證 Cluster 狀態是否正常(可選)
1
2kubectl get nodes
kubectl get pods -A - 安裝 Helm 並開始部署應用
- → Helm 利用
kubectl
與 cluster 溝通來部署資源。
- → Helm 利用
🛠️ Cluster 建立工具建議:
用途 | 適合工具 |
---|---|
本機學習/開發 | Minikube、Kind、kubeadm |
雲端正式環境 | EKS(AWS)、GKE(Google)、AKS(Azure) |
Helm2 vs Helm3
- Helm 1.0: Feb 2016
- Helm 2.0: Nov 2016
+
Tiller-
3-Way Strategic Merge Patch
- Helm 3.0: Nov 2019
-
Tiller+
RBAC (Role Based Access Control)+
CRD (Custom Resource Definitions) 自定資源+
3-Way Strategic Merge Patch
功能 / 特性 | Helm 2 | Helm 3 |
---|---|---|
Server-side component | ✅ Tiller | ❌ 無 Tiller |
安全性(RBAC) | ❌ 手動設定 | ✅ 原生整合 |
CRD 支援 | ⚠️ 需額外處理 | ✅ 原生支援 |
Release 狀態儲存位置 | ConfigMap in Tiller namespace | Secrets/ConfigMap in namespace |
3-Way Strategic Merge Patch | ❌ | ✅ |
3-Way Strategic Merge Patch
當執行 helm upgrade
時,Helm 3 使用「三方比對策略」來合併資源變更:
- Live manifest:目前實際在 Cluster 中的資源狀態
- Last applied manifest:上一次部署(Helm 安裝或升級)所產生的 YAML
- New manifest:這次
helm upgrade
將套用的新 YAML
Helm 會比較這三份資料的差異,自動計算最安全的更新方式,從而:
- 避免覆蓋使用者透過
kubectl edit
所做的即時修改 (保留現有狀態中「使用者手動修改的內容」) - 提供更穩定、安全的 upgrade 與 rollback 機制
優點:
- 安全地進行
upgrade
或rollback
- 支援變數參數化與動態部署
- 保留 live 狀態下手動調整的內容
- 提升應用穩定性與維運效率
Helm Charts
Helm Chart 是一個用來描述 Kubernetes 應用的「套件」,包含:
- Kubernetes 資源的 YAML 模板(Templates)
- 預設變數(values)
- Chart metadata(如名稱、版本、依賴)
透過 Helm,你可以將應用「參數化、模組化、版本化」,並用簡單指令完成部署與升級。
📁 Chart 目錄結構範例 (hello-world-chart)
A Chart
is a Helm package. It contains all of the resource definitions necessary to run an application, tool, or service inside of a Kubernetes cluster.
1 | hello-world-chart/ |
✅ 可用
helm create hello-world-chart
快速建立基本結構。
Chart.yaml 說明
Chart.yaml
是每個 Chart 的核心定義檔,描述這個應用的 metadata 與依賴:
1 | apiVersion: v2 # Chart API 版本(v1: Helm 2, v2: Helm 3) |
apiVersion: v2
- Helm 3 使用,支援 dependencies、自動驗證等功能
type:
- application(預設):可直接部署的應用程式(如 NGINX、MySQL)
- library:提供其他 Chart 引用(不能單獨部署)
dependencies:
- 定義需要一併部署的其他 Charts(如資料庫、共用模組)
- 可手動放進
charts/
資料夾或使用helm dependency update
自動下載
values.yaml 說明
values.yaml
是 Helm Chart 的預設變數設定檔,使用者可透過參數調整部署細節。
1 | replicaCount: 2 |
可在 templates/deployment.yaml 中這樣使用:
1 | spec: |
✅ 使用者可以透過
helm install -f my-values.yaml
自訂部署變數。
Customizing Chart Parameters
Helm 提供兩種方式來覆蓋 Chart 中的預設變數設定(values.yaml):
方式一:使用 --set
單行指定參數
1 | helm install --set wordpressBlogName="Helm Tutorials" my-release bitnami/wordpress |
- 適合修改少量變數。
- 可用
--set key1=value1,key2=value2
一行指定多個值。 - 不支援複雜結構(如陣列、巢狀結構)。
方式二:使用 --values
指定自訂的 YAML 設定檔
custom-values.yaml
1 | wordpressBlogName: "Helm YAML Custom Blog" |
1 | helm install --values custom-values.yaml my-release bitnami/wordpress |
- 適合修改多個參數,或巢狀結構。
- 檔案結構需與原本 values.yaml 相容。
解壓並修改 Chart 原始檔
你也可以下載並解壓 Helm Chart 原始內容來進一步客製化:
1 | helm pull bitnami/wordpress |
這方式適合需要修改模板檔(如 deployment.yaml)或加入其他資源。
💡 若安裝出現錯誤,請確認 chart repository 已更新:
helm repo update
。
Helm Release LifeCycle Management
使用 Helm 部署後,release 的版本管理與 rollback 是日常操作中很重要的一環。
查看 Pod 與部署狀態(K8s 層級)
1 | kubectl get pods # 查看目前 Pod 狀態 |
升級 Chart(如有更新)
1 | helm upgrade nginx-release bitnami/nginx # 升級 nginx-release |
若想自訂參數升級,可搭配
--set
或--values
查看 Release 歷史紀錄
1 | helm list # 所有 Helm release |
回滾 Release 至先前版本
1 | helm rollback dazzling-web |
Helm 每次 upgrade 都會記錄版本,預設保留最後 10 個版本。