K8s的包管理工具--Helm安装及使用(1)
文章目录
1、什么是heml
helm是k8s集群的包管理器,用来管理集群中的各种chart包。相当于centos系统中的yum工具,可以将一个服务相关的资源对象信息(比如deployment、configmap、service等)整合到一个chart包中,可以使用一套yaml文件将应用部署到不同的环境中,比如开发环境、部署环境、测试环境。
2、应用部署k8s集群的传统方式
拉取代码
↓
打包应用
↓
构建docker镜像
↓
编写yaml文件(service、deployment、configmap)
↓
kubectl命令部署
传统方式存在的问题
- 应用增多后,会有大量的yaml文件,维护yaml文件比较麻烦;
- 不同的环境,需要不同的yaml文件,需要指定不同的名称及命名空间
3、Helm的优势
- 简化部署与管理:使用helm命令即可完成应用的部署、升级与回滚,不需要重复编写yaml文件,例如:
helm install myapp ./chart - 可配置化:可使用
values.yaml文件传入参数,不需要手动修改yaml文件 - 可重复应用:相同的chart可以应用于开发、生产和测试环境,只需更改values文件
4、Helm的相关组件
chart:helm中的一个chart包(理解为yum中的rpm包),本质是一个目录,包含以下内容
mychart/ # Chart 根目录
├── Chart.yaml # Chart 的元数据(名称、版本、描述等)
├── values.yaml # 默认的配置文件(可被用户覆盖)
├── values.schema.json # (可选)values.yaml 的 JSON Schema 校验
├── charts/ # 依赖的子 Chart 存放位置
├── templates/ # 模板文件(核心,定义 Kubernetes 资源)
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # 模板函数(定义可复用的 helper)
│ └── NOTES.txt # 安装成功后输出的提示信息
├── crds/ # (可选)自定义资源定义 CRD
├── templates/tests/ # (可选)测试 Pod,用于验证 Chart 部署成功
└── .helmignore # (可选)打包时忽略的文件(类似 .gitignore)
release:用chart包部署的应用的实例,helm部署一次chart就会有一个唯一的release,每个release都可以理解为应用的版本,比如nginx-dev、nginx-prodrepository:helm仓库,用于存放chart包,类似yum仓库helm cli:helm的命令行工具,用于用户交互
5、helm的安装
helm安装之前需要准备好k8s环境
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 145d v1.23.5
node-1 Ready <none> 145d v1.23.5
node-2 Ready <none> 145d v1.23.5
helm的下载地址:helm官方release
wget https://get.helm.sh/helm-v3.7.2-linux-amd64.tar.gz
[root@master ~]# tar -xf helm-v3.7.2-linux-amd64.tar.gz
helm为二进制包,解压即安装,解压后会生成一个linux-amd/64目录
[root@master ~]# ls linux-amd64/
helm LICENSE README.md
移动helm到系统的path中
[root@master ~]# cp linux-amd64/helm /usr/bin/helm
[root@master ~]# helm version
version.BuildInfo{Version:"v3.7.2", GitCommit:"663a896f4a815053445eec4153677ddc24a0a361", GitTreeState:"clean", GoVersion:"go1.16.10"}
6、helm创建
创建helm
语法:helm create chart名
[root@master Helm]# helm create mychart
Creating mychart
# 创建chart后会在当前目录生成一个chart包
[root@master Helm]# ls
mychart
# chart包中包含有chart目录结构中的内容
[root@master Helm]# ls mychart/
charts Chart.yaml templates values.yaml
[root@master Helm]# tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
注意:templates目录内有许多yaml文件,都是内置的模板文件,实际使用时按照自己需求删除或更改即可。
使用chart创建一个configmap实例
[root@master Helm]# cd mychart/templates/
[root@master templates]# rm -rf ./*
[root@master templates]# vim configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "hello world"
[root@master templates]# cd ~/Helm
[root@master Helm]# ls
mychart
# 在chart包目录执行install命令
# 语法: helm install chart示例名 chart包目录
[root@master Helm]# helm install myconfigmap mychart/
NAME: myconfigmap
LAST DEPLOYED: Mon Oct 13 21:15:46 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
# 查看通过helm创建的configmap
[root@master Helm]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myconfigmap default 1 2025-10-13 21:15:46.881280937 +0800 CST deployed mychart-0.1.0 1.16.0
[root@master Helm]# kubectl get configmap | grep mychart
mychart-configmap 1 116s
# 查看release详细信息
[root@master Helm]# helm get manifest myconfigmap
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "hello world"
# 删除release helm uninstall release名
[root@master Helm]# helm uninstall myconfigmap
release "myconfigmap" uninstalled
[root@master Helm]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
引用对象创建configmap
编写一个chart,在configmap.yaml文件内设置对象,在values.yaml文件中设置对象值,通过对象的引用创建configmap
# configmap.yaml文件
[root@master templates]# cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap # .Release.Name为创建chart的release名,Name为内置对象
data:
myvalue: {{ .Values.MY_VALUE }} # .Value.MY_VALUE为vaules.yaml文件中的MY_VALUE对象
# values.yaml文件定义对象值
[root@master mychart]# cat values.yaml
MY_VALUE: "hello world"
# 创建release
[root@master Helm]# helm install myconfigmap-2 mychart/
NAME: myconfigmap-2
LAST DEPLOYED: Mon Oct 13 21:33:16 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
# 查看release,发现configmap名与relase名相同,对象已经传递成功
[root@master Helm]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myconfigmap-2 default 1 2025-10-13 21:33:16.149662127 +0800 CST deployed mychart-0.1.0 1.16.0
[root@master Helm]# kubectl get configmap | grep myconf
myconfigmap-2-configmap 1 51s
7、helm常用命令
创建chart
helm create chart包名
打包chart
helm package <chart目录>
helm package ./my-chart
创建release
helm install release名 chart目录
试运行release
helm install release名 chart目录 --debug -dry-run
查看release
helm list
查看release详细信息
helm get manifest release名
删除release
helm uninstall release名
升级release
helm upgrade <发布名称> <chart>
helm upgrade my-nginx aliyun/nginx --set image.tag=1.20
回滚release
helm rollback <发布名称> <修订版本号>
helm rollback my-nginx 1
查看release状态
helm status release名
添加仓库
语法:helm repo add 仓库名 仓库地址
[root@k8s-master ~]# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
[root@k8s-master ~]# helm repo add azure http://mirror.azure.cn/kubernetes/charts
[root@k8s-master ~]# helm repo add kaiyuanshe http://mirror.kaiyuanshe.cn/kubernetes/charts
[root@k8s-master ~]# helm repo add bitnami https://charts.bitnami.com/bitnami
查看仓库
语法: helm repo list
[root@k8s-master ~]# helm repo list
NAME URL
stable http://mirror.azure.cn/kubernetes/charts/
kaiyuanshe http://mirror.kaiyuanshe.cn/kubernetes/charts
azure http://mirror.azure.cn/kubernetes/charts
删除仓库
语法: helm repo remove 仓库名
[root@k8s-master ~]# helm repo remove stable
"stable" has been removed from your repositories
更新仓库
helm repo update
搜索chart包
语法:helm search repo chart包名
[root@k8s-master ~]# helm search repo tomcat
NAME CHART VERSION APP VERSION DESCRIPTION
azure/tomcat 0.4.3 7.0 DEPRECATED - Deploy a basic tomcat application ...
kaiyuanshe/tomcat 0.4.3 7.0 DEPRECATED - Deploy a basic tomcat application ...
查看chart包
语法:helm show chart chart包名
# 查看chart包基础信息
[root@k8s-master ~]# helm show chart azure/tomcat
apiVersion: v1
appVersion: "7.0"
deprecated: true
description: DEPRECATED - Deploy a basic tomcat application server with sidecar as
web archive container
home: https://github.com/yahavb
icon: http://tomcat.apache.org/res/images/tomcat.png
name: tomcat
version: 0.4.3
# 查看chart包详细信息
helm show values azure/tomcat
拉取chart包
语法:pull chart chart包名
[root@k8s-master ~]# helm pull azure/tomcat
[root@k8s-master ~]# ls tomcat-0.4.3.tgz
tomcat-0.4.3.tgz
注意:拉取时加上--version chart版本号可以指定版本,不指定版本默认拉取最新的chart包;--untar可以在拉取时解压
[root@k8s-master ~]# helm pull azure/tomcat --version 0.4.3 --untar
[root@k8s-master ~]# ls tomcat/
Chart.yaml README.md templates values.yaml
安装chart包为release
本地创建的chart包安装命令为helm install release名 chart目录
远程仓库chart包安装命令有以下几种方式:
helm install release名 远程仓库的chart包名 # 直接从远程仓库安装chart
helm install release名 chart.gz文件 # 安装拉取到本地但未解压的chart
helm install release名 拉取到本地的chart包名 # 安装拉取到本地已解压的chart
helm install release名 chart包url # 从网络服务器安装chart
[root@k8s-master ~]# helm install tomcat1 azure/tomcat
[root@k8s-master ~]# helm install tomcat2 tomcat/
[root@k8s-master ~]# helm install tomcat3 tomcat-0.4.3.tgz
[root@k8s-master ~]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
tomcat1 default 1 2025-10-15 17:14:33.729521682 +0800 CST deployed tomcat-0.4.3 7.0
tomcat2 default 1 2025-10-15 17:15:21.915075747 +0800 CST deployed tomcat-0.4.3 7.0
tomcat3 default 1 2025-10-15 17:16:04.974136723 +0800 CST deployed tomcat-0.4.3 7.0
8、helm的内置对象
helm在渲染模板时,会提供一系列内置对象给模板使用,编写chart时,可以直接在/templates/*.yaml文件中引用。heml的内置对象包括.Release对象、.Values对象、.Chart对象、.Files对象、.Capabilities对象、.Template对象等。
8.1 Release对象
.Relase对象可获取本次部署的release相关信息,主要对象有:
.Release.Name #本次部署的Release名
.Release.Namespace #本次部署的命名空间
.Release.IsInstall # 本次部署是否为安装操作,true/false
.Release.IsUpgrade #本次部署是否为升级操作,true/false
.Release.IsRollback # 本次部署是否为回滚操作,true/false
.Release.Revision # Release修订版本号,每次升级+1
.Release.Service # 发布工具名,通常为helm
.Release对象的引用
[root@master Helm]# cat mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}
namespace: {{ .Release.Namespace }}
data:
IsInstall: "{{ .Release.IsInstall }}"
IsUpgrade: "{{ .Release.IsUpgrade }}"
IsRollback: "{{ .Release.IsRollback }}"
Revision: "{{ .Release.Revision }}"
Service: "{{ .Release.Service }}"
`注意:由于configMap中的data必须为字符串,而IsInstall、IsUpgrade、IsRollback为布尔值,
因此需要将其转为字符串,不加双引号会报错`
试运行yaml文件,查看对象是否获取值
[root@master Helm]# helm install mytest mychart/ --debug --dry-run
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mytest
namespace: default
data:
IsInstall: "true"
IsUpgrade: "false"
IsRollback: "false"
Revision: "1"
Service: "Helm"
8.2 Values对象
.Values对象是最常用的对象,使用时在values.yaml文件中传递对象值。
设定对象值
cat values.yaml
replicaCount: 3
image:
repository: nginx
tag: 1.27
引用变量值
cat deployment.yaml
apiVersion: v1
kind: Deployment
metadata:
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
spec:
containers:
- name: {{ .Release.Name }}
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
部署chart,查看values.yaml中的对象是否正确传递值
[root@master Helm]# helm install mytest mychart/ --debug --dry-run
install.go:178: [debug] Original chart version: ""
install.go:199: [debug] CHART PATH: /root/Helm/mychart
NAME: mytest
LAST DEPLOYED: Tue Oct 14 22:16:09 2025
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
image:
repository: nginx
tag: latest
replicaCount: 3
HOOKS:
MANIFEST:
# Source: mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mytest
spec:
replicas: 3
selector:
matchLabels:
app: mytest
template:
metadata:
labels:
app: mytest
spec:
containers:
- name: mytest
image: nginx:latest
# 可以看到deployment内的name、image、name都获取到values.yaml内的对象值
8.3 Chart对象
.Chart对象可获取当前chart的基本信息,包含以下对象
.Chart.Name # Chart名
.Chart.Version # Chart版本
.Chart.AppVersion # 应用版本
.Chart.Description # Chart描述
.Chart对象的引用
apiVersion: v1
kind: Pod
metadata:
name: {{ .Release.Name }}
data:
value1: {{ .Chart.Name }}
value2: {{ .Chart.Version }}
部署chart,查看.Chart对象值是否引用成功
[root@master Helm]# helm install mytest mychart/ --debug --dry-run
install.go:178: [debug] Original chart version: ""
install.go:199: [debug] CHART PATH: /root/Helm/mychart
NAME: mytest
LAST DEPLOYED: Tue Oct 14 22:21:48 2025
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
image:
repository: nginx
tag: latest
replicaCount: 3
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mytest
namespace: default
data:
Name: "mychart"
Version: "0.1.0"
AppVersion: "1.16.0"
Description: "A Helm chart for Kubernetes"
# 可以看到data内的所有对象都获取到值
8.4 Files对象
.Files 用于读取非模板文件(如配置文件、脚本、证书等),通常位于 charts/mychart/files/。
| 方法 | 说明 |
|---|---|
.Files.Get "path/to/file" | 读取文件内容为字符串 |
.Files.GetBytes "path/to/file" | 获取二进制内容 |
.Files.Glob "pattern" | 根据通配符匹配文件 |
.Files.AsSecrets | 将文件内容编码为 Base64 |
.Files.AsConfig | 将文件内容嵌入 ConfigMap |
data:
app.conf: |
{{ .Files.Get "files/app.conf" | indent 4 }}
8.5 Capabilities对象
.Capabilities对象可获取k8s集群的相关信息,包含以下对象
.Capabilities.KubeVersion.Version # k8s版本号
.Capabilities.KubeVersion.Major # k8s主版本号
.Capabilities.KubeVersion.Minor # k8s小版本号
.Capabilities.APIVersions.Has "apps/v1" # 判断某个api是否可用
.Capabilities对象的引用
apiVersion: v1
kind: Pod
metadata:
name: {{ .Release.Name }}
data:
value1: {{ .Capabilities.KubeVersion.Version }}
value2: {{ .Capabilities.KubeVersion.Major }}
value3: {{ .Capabilities.KubeVersion.Minor }}
value4: {{ .Capabilities.APIVersions.Has "apps/v1" }}
部署chart,查看.Capabilities对象值是否引用成功
[root@master Helm]# helm install mytest mychart/ --debug --dry-run
install.go:178: [debug] Original chart version: ""
install.go:199: [debug] CHART PATH: /root/Helm/mychart
NAME: mytest
LAST DEPLOYED: Tue Oct 14 22:26:41 2025
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
image:
repository: nginx
tag: latest
replicaCount: 3
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mytest
namespace: default
data:
KubeVersion_Version: v1.23.5
KubeVersion_Major: 1
KubeVersion_Minor: 23
value4: true
8.6 Template对象
.Template对象可获取模板文件信息,包含以下对象
.Template.Name #当前正在执行模板文件的完整路径和名称,即包含该对象的文件的路径(相对chart目录)
.Template.BasePath # 获取模板文件的基础路径(不包含文件名)
.Template对象的引用
apiVersion: v1
kind: Pod
metadata:
name: {{ .Release.Name }}
data:
value1: {{ .Template.Name }}
value2: {{ .Template.BasePath }}
部署chart,查看.Capabilities对象值是否引用成功
[root@master Helm]# helm install mytest mychart/ --debug --dry-run
install.go:178: [debug] Original chart version: ""
install.go:199: [debug] CHART PATH: /root/Helm/mychart
NAME: mytest
LAST DEPLOYED: Tue Oct 14 22:28:08 2025
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
image:
repository: nginx
tag: latest
replicaCount: 3
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mytest
namespace: default
data:
Name: mychart/templates/configmap.yaml
BasePath: mychart/templates
# 可以看到Name值为configmap文件相对chart的路径+文件名,BasePath只是路径
9、helm实战案例
通过helm完成nginx的安装、升级、回滚和卸载
9.1 nginx部署
9.1.1 nginx-chart包编辑
创建chart包
[m1@k8s-master ~]$ helm create nginx-chart
Creating nginx-chart
[m1@k8s-master ~]$ ls
nginx-chart
编辑/templates/nginx.yaml文件
[m1@k8s-master ~]$ rm -rf nginx-chart/templates/*
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.deployment_name }}
namespace: {{ .Values.namespace }}
spec:
replicas: {{ .Values.replica_count }}
selector:
matchLabels:
app: {{ .Values.pod_label }}
template:
metadata:
labels:
app: {{ .Values.pod_label }}
spec:
containers:
- image: {{ .Values.image }}:{{ .Values.image_tag }}
name: {{ .Values.container_name }}
ports:
- containerPort: {{ .Values.container_port }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ .Values.service_name }}
namespace: {{ .Values.namespace }}
spec:
selector:
app: {{ .Values.pod_label }}
type: NodePort
ports:
- port: {{ .Values.port }}
targetPort: {{ .Values.targetPort }}
nodePort: {{ .Values.nodePort }}
protocol: TCP
编辑values.yaml文件
deployment_name: nginx-deployment
namespace: nginx-chart
replica_count: 2
pod_label: nginx-pod
image: nginx
image_tag: 1.23
container_name: nginx
container_port: 80
service_name: nginx-service
port: 80
targetPort: 80
nodePort: 30030
9.1.2 nginx-release部署
部署nginx的release
# 创建命名空间
[root@master m1]# kubectl create namespace nginx-chart
namespace/nginx-chart created
# 安装chart
[root@master m1]# helm install nginx-chart nginx-chart/
[root@master m1]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
nginx-chart default 1 2025-10-16 20:44:47.347278204 +0800 CST deployed nginx-chart-0.1.0 1.16.0
# 查看deployment状态
[root@master m1]# kubectl get deploy -n nginx-chart
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 65s
# 查看service状态
[root@master m1]# kubectl get svc -n nginx-chart
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.96.75.208 <none> 80:30030/TCP 2m14s
# 查看pod
[root@master m1]# kubectl get pod -n nginx-chart
NAME READY STATUS RESTARTS AGE
nginx-deployment-6c868cbbb7-44nnx 1/1 Running 0 3m31s
nginx-deployment-6c868cbbb7-4wtx5 1/1 Running 0 3m31s
[root@master m1]# kubectl get pod -n nginx-chart -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-6c868cbbb7-44nnx 1/1 Running 0 3m35s 10.244.2.77 node-2 <none> <none>
nginx-deployment-6c868cbbb7-4wtx5 1/1 Running 0 3m35s 10.244.1.78 node-1 <none> <none>
# 使用node节点访问集群内部ip
[root@node-2 ~]# curl 10.96.75.208
<h1>Welcome to nginx!</h1>
# 使用node节点访问节点ip
[root@node-2 ~]# curl 192.168.253.23:30030
<h1>Welcome to nginx!</h1>
9.1.3 nginx-release升级
更改nginx镜像为1.24,升级release
[root@master m1]# helm upgrade nginx-chart nginx-chart/ --set image_tag=1.24
Release "nginx-chart" has been upgraded. Happy Helming!
NAME: nginx-chart
LAST DEPLOYED: Thu Oct 16 20:53:40 2025
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
[root@master m1]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
nginx-chart default 2 2025-10-16 20:53:40.085944231 +0800 CST deployed nginx-chart-0.1.0 1.16.0
[root@master m1]# kubectl get deploy -n nginx-chart -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 2/2 2 2 10m nginx nginx:1.24 app=nginx-pod
9.1.4 nginx-release回滚
将nginx-release回滚到第1个版本
[root@master m1]# helm rollback nginx-chart 1
Rollback was a success! Happy Helming!
[root@master m1]# kubectl get deploy -n nginx-chart -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx-deployment 2/2 2 2 11m nginx nginx:1.23 app=nginx-pod
9.1.5 nginx-release卸载
[root@master m1]# helm uninstall nginx-chart
release "nginx-chart" uninstalled
[root@master m1]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
[root@master m1]# kubectl get deploy -n nginx-chart -o wide
No resources found in nginx-chart namespace.
更多推荐

所有评论(0)