博客 / 詳情

返回

Kubernetes Charts資源包管理工具之Heml學習總結

實踐環境

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 installhelm upgradehelm 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. 訪問驗證

![image-20260118234921918](images/k8s Charts資源包管理工具之Heml學習總結/image-20260118234921918.png)

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
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.