實踐環境
registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.27.16
registry.cn-shanghai.aliyuncs.com/labring/helm:v3.8.2
簡介
Helm 是 Kubernetes 生態系統中最核心的包管理工具,被譽為“Kubernetes 的 apt/yum”,其設計目標是簡化 Kubernetes 應用的部署、管理與分發,通過標準化的“包”格式(Chart)解決 Kubernetes 原生資源配置複雜、複用性差的痛點。
一、Helm 的核心定位:Kubernetes 應用的“包管理器”
Helm 的本質是將 Kubernetes 應用的所有資源(Deployment、Service、ConfigMap、Secret 等)打包成一個可複用的“Chart”,並通過“Release”機制管理應用的生命週期(安裝、升級、回滾、卸載)。其核心類比:
- Chart:相當於 Linux 中的
.deb/.rpm包,或 Python 中的pip包,包含應用運行所需的所有 Kubernetes 資源模板與默認配置; - Release:相當於“安裝後的應用實例”,每個 Chart 可在集羣中安裝多次,生成多個獨立的 Release(如同一 MySQL Chart 可部署“開發庫”與“測試庫”兩個 Release);
- Repository:相當於“應用商店”,用於存儲與共享 Chart(如公共的 Artifact Hub,或企業內部私有倉庫)。
二、Helm 的核心概念解析
要理解 Helm 的工作方式,必須掌握以下四個核心概念:
1. Chart:應用的“藍圖”
Chart 是 Helm 的打包格式,用於將 Kubernetes 應用的資源模板與配置封裝為一個可複用的單元。其目錄結構如下:
my-chart/
├── Chart.yaml # 必須:Chart 的元數據(名稱、版本、描述、依賴等)
├── values.yaml # 必須:默認配置值(如副本數、鏡像標籤、資源限制)
├── templates/ # 必須:Kubernetes 資源模板(帶 Go 模板語法,如 deployment.yaml、service.yaml)
├── charts/ # 可選:依賴的子 Chart(如應用依賴的數據庫 Chart)
└── README.md # 可選:Chart 的説明文檔
- templates/:存放帶模板語法的 Kubernetes 資源文件,通過
values.yaml中的值動態渲染(如{{ .Values.replicaCount }}會被替換為實際的副本數); - values.yaml:提供模板的默認值,用户安裝時可覆蓋(如
helm install --set replicaCount=3)。
2. Release:Chart 的“運行實例”
Release 是Chart 在 Kubernetes 集羣中的具體運行實例。每執行一次 helm install,Helm 會根據 Chart 生成一個唯一的 Release(如 my-nginx-release),並記錄其版本歷史(通過 helm history <release-name>查看)。Release 的核心特性:
- 唯一性:同一 Chart 可在同一集羣中安裝多次,每個 Release 有獨立的名稱與資源;
- 版本管理:Helm 會記錄每個 Release 的所有變更(如升級、回滾),支持一鍵回滾到任意歷史版本(如
helm rollback <release-name> 1)。
3. Repository:Chart 的“存儲與共享中心”
Repository 是存儲 Chart 的倉庫,類似於 Docker Hub 或 PyPI。其核心作用是:
-
共享 Chart:公共 Repository(如 Artifact Hub)提供數千個現成的 Chart(如 Nginx、MySQL、Redis),用户可直接搜索並安裝;
-
私有部署:企業可搭建內部 Repository(如通過 Harbor 或 ChartMuseum),用於存儲內部應用的 Chart,實現標準化分發。
Helm 支持添加多個 Repository(如
helm repo add bitnami https://charts.bitnami.com/bitnami),並通過helm repo update同步最新 Chart 列表。
4. Helm Client:命令行工具
Helm Client 是用户與 Helm 交互的主要方式,通過命令行指令(如 helm install、helm upgrade、helm rollback)管理 Chart 與 Release。與 Kubernetes 原生的 kubectl不同,Helm Client 聚焦應用級別的管理(而非單個資源),例如:
helm install my-nginx bitnami/nginx:安裝 Bitnami 提供的 Nginx Chart,生成名為my-nginx的 Release;helm upgrade my-nginx bitnami/nginx --set replicaCount=3:升級my-nginx的副本數為 3;helm rollback my-nginx 1:回滾my-nginx到版本 1。
三、Helm 的核心價值:解決 Kubernetes 管理的痛點
Kubernetes 原生部署應用需要編寫大量 YAML 文件(如 Deployment、Service、ConfigMap),且需手動管理這些文件的版本、依賴與回滾,效率低且易出錯。Helm 針對這些痛點提供了以下核心價值:
1. 簡化部署流程
通過 Chart 封裝所有資源,用户只需執行一條命令(helm install)即可部署複雜應用(如包含前端、後端、數據庫的微服務),無需手動創建多個 YAML 文件。
2. 標準化與複用
Chart 將應用的資源配置標準化(如統一的目錄結構、模板語法),企業可將內部應用的 Chart 存儲在私有 Repository 中,實現跨部門複用(如“支付服務”Chart 可被多個業務線使用)。
3. 版本控制與回滾
Helm 記錄每個 Release 的所有變更(如升級時的配置修改),支持一鍵回滾到任意歷史版本(如升級失敗後回滾到穩定版本),降低生產環境的風險。
4. 依賴管理
Chart 可通過 requirements.yaml(Helm 2)或 Chart.yaml(Helm 3)聲明依賴(如應用依賴 MySQL 數據庫),Helm 會自動下載並安裝依賴的 Chart,無需手動處理
Helm安裝
二進制安裝
# tar -zxvf helm-v4.0.0-linux-amd64.tar.gz
# mv linux-amd64/helm /usr/local/bin/helm
下載地址:https://github.com/helm/helm/releases
參考鏈接:https://helm.sh/docs/intro/install
鏡像安裝(基於sealos)
# sealos run registry.cn-shanghai.aliyuncs.com/labring/helm:v3.8.2
説明:基於 OCI 鏡像的安裝方式,通過 Sealos 工具將預打包的 Helm v3.8.2 鏡像部署到 Kubernetes 集羣
入門示例--Nginx服務部署
Chart資源包構造--極簡版 Bitnami Nginx Helm Chart
參考連接: https://github.com/bitnami/charts/tree/main/bitnami/nginx
文件組織結構
my-minimal-nginx/
├── Chart.yaml # Chart 元數據
├── values.yaml # 可配置參數(Deployment/Service 核心配置)
└── templates/
├── deployment.yaml # Deployment 模板
└── service.yaml # Service 模板(暴露外部 IP)
📄 1. Chart.yaml(Chart 元數據)
定義 Chart 名稱、版本、描述等基礎信息:
apiVersion: v2
name: my-minimal-nginx # Chart 名稱(部署後資源會帶此前綴)
description: A simplified Helm chart to deploy Nginx with NodePort
version: 0.1.0 # Chart 版本(語義化版本,便於迭代)
📄 2. values.yaml(核心可配置參數)
存儲 Deployment 和 Service 的默認配置(部署時可通過 -f覆蓋):
image:
repository: nginx # Nginx 鏡像倉庫(用 Docker Hub 官方鏡像,簡化依賴)
tag: latest # 鏡像標籤(版本)
replicaCount: 1 # Nginx Pod 副本數(高可用,可按需調整)
service:
type: NodePort # 服務類型改為 NodePort
port: 80 # Service 對外暴露的邏輯端口(集羣內/外訪問統一用 80)
targetPort: 80 # 轉發到 Nginx Pod 的端口
nodePort: 30080 # (可選)指定節點上的端口,範圍 30000-32767;不填則 K8s 自動分配
📄 3. templates/deployment.yaml(Deployment 模板)
用 Go 模板語法 動態生成 Kubernetes Deployment YAML:
{{- /*
deployment.yaml:定義 Nginx Deployment 資源
模板邏輯:通過 {{ .Values.XXX }} 讀取 values.yaml 配置,通過 {{ .Chart.XXX }}讀取Chart.yaml配置,動態生成 YAML
- */ -}}
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-deployment # 資源名 = 發佈名 + 固定後綴
labels:
app: {{ .Chart.Name }} # 標籤:關聯 Chart 名稱(my-minimal-nginx)
spec:
replicas: {{ .Values.replicaCount }} # 副本數(從 values.yaml 讀取)
selector:
matchLabels:
app: {{ .Chart.Name }} # Selector:匹配 Pod 標籤(必須和 Pod 模板一致)
template:
metadata:
labels:
app: {{ .Chart.Name }} # Pod 標籤(必須和 selector.matchLabels 一致)
spec:
containers:
- name: nginx-container # 容器名
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" # 鏡像地址(倉庫 + 標籤)
ports:
- containerPort: {{ .Values.service.targetPort }} # 容器暴露的端口(從 values.yaml 讀取)
📄 4. templates/service.yaml(Service 模板)
用 Go 模板生成 Kubernetes Service YAML,實現外部 IP 暴露:
{{- /*
service.yaml:定義 Service 資源,支持 NodePort/LoadBalancer 暴露
- NodePort:通過節點 IP + nodePort 訪問(如 192.168.88.139:30080)
- LoadBalancer:通過雲廠商負載均衡器 IP 訪問
- */ -}}
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-service # 服務名 = 發佈名 + 固定後綴
labels:
app: {{ .Chart.Name }} # 標籤:關聯 Chart 名稱
spec:
type: {{ .Values.service.type }} # 服務類型(從 values.yaml 讀取:NodePort/LoadBalancer)
selector:
app: {{ .Chart.Name }} # 關聯 Pod 標籤(必須和 Deployment 模板的 labels 一致)
ports:
- protocol: TCP
port: {{ .Values.service.port }} # Service 邏輯端口(集羣內訪問用)
targetPort: {{ .Values.service.targetPort }} # 轉發到 Pod 的端口
{{- if eq .Values.service.type "NodePort" }} # 僅 NodePort 類型時添加 nodePort 字段
nodePort: {{ .Values.service.nodePort }} # 節點上暴露的端口(範圍 30000-32767,可選配置)
{{- end }}
🔧 部署 & 驗證(核心步驟)
1. 部署到 Kubernetes 集羣
進入 my-minimal-nginx所在目錄,執行 helm install:
# helm install my-nginx ./my-minimal-nginx
NAME: my-nginx-release
LAST DEPLOYED: Sun Jan 18 22:44:32 2026
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
my-nginx是本次部署的發佈名(自定義,集羣內唯一)。
2. 查看 Service 狀態(確認 NodePort)
部署完成後,執行以下命令查看 Service 狀態(重點看 EXTERNAL-IP):
# kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 35h
default my-nginx-service NodePort 10.96.2.4 <none> 80:30080/TCP 57s
kube-system hubble-peer ClusterIP 10.96.2.226 <none> 443/TCP 35h
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 35h
# kubectl get svc my-nginx-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx-service NodePort 10.96.0.178 <none> 80:30080/TCP 3m47s
3. 查看pod狀態
# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-nginx-deployment-ff65df8fb-j6ct7 1/1 Running 0 2m25s 10.0.1.54 192-168-88-140 <none> <none>
4. 訪問驗證

Helm核心命令
1. 添加 Chart 倉庫
# 添加官方倉庫(推薦 Bitnami)
# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
# 更新倉庫索引
# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "bitnami" chart repository
Update Complete. ⎈Happy Helming!⎈
2. 搜索 Chart
# 搜索 Nginx Chart
# helm search repo nginx
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/nginx 22.4.3 1.29.4 NGINX Open Source is a web server that can be a...
bitnami/nginx-ingress-controller 12.0.7 1.13.1 NGINX Ingress Controller is an Ingress controll...
bitnami/nginx-intel 2.1.15 0.4.9 DEPRECATED NGINX Open Source for Intel is a lig...
3. 安裝 Chart
# 基礎安裝(使用默認配置)
helm install my-nginx bitnami/nginx
# 自定義配置(通過 values.yaml 覆蓋默認值)
helm install my-nginx bitnami/nginx -f values.yaml
# 安裝時指定名稱空間--指定安裝到哪個名稱空間
# helm install my-nginx-release ./my-minimal-nginx -n base_app
# helm install my-nginx-release ./my-minimal-nginx --namespace base_app
# 安裝本地自定義Chart
# helm install my-nginx-release ./my-minimal-nginx
NAME: my-nginx-release
LAST DEPLOYED: Sun Jan 18 22:44:32 2026
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
説明:有時候執行卸載命令,再次安裝時會報錯:
Error: INSTALLATION FAILED: cannot re-use a name that is still in use
此時執行helm list -n <命名空間> 看不到對應名稱的發佈。
解決方法:
# 查找殘留的 Secret(Helm 3 默認存儲方式)
kubectl get secrets -n <命名空間> | grep "sh.helm.release.v1.your-custom-release-name"
# 刪除殘留 Secret
kubectl delete secret sh.helm.release.v1.your-custom-release-name.v1 -n <命名空間>
4. 查看已部署的 Release
#列出所有 Release
# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-nginx default 3 2026-01-18 23:54:01.031035787 +0800 CST deployed my-minimal-nginx-0.1.0
#查看 Release 詳情
# helm status my-nginx
NAME: my-nginx
LAST DEPLOYED: Sun Jan 18 23:54:01 2026
NAMESPACE: default
STATUS: deployed
REVISION: 3
TEST SUITE: None
5. 升級 Release
# 修改 values.yaml 後升級
helm upgrade my-nginx bitnami/nginx -f values.yaml
# 修改本地自定義Chart後升級
# helm upgrade my-nginx-release ./my-minimal-nginx
Release "my-nginx-release" has been upgraded. Happy Helming!
NAME: my-nginx-release
LAST DEPLOYED: Sun Jan 18 22:58:51 2026
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
6. 回滾 Release
# 查看 Release 歷史版本
helm history my-nginx
# 回滾到指定版本(如 revision 2)
helm rollback my-nginx 2
7. 卸載 Release
# helm uninstall my-nginx
release "my-nginx" uninstalled
注意:如果Release不在默認名稱空間下,則需要顯示指定,如下:
helm uninstall my-nginx -n your_space_name