Helm简单使用教程
Helm
Helm是一个用于kubernetes的包管理器。对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。
对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用。
之所以要使用Helm,是因为一个应用在K8s上部署会涉及到诸多API对象,需要多个yaml协同合作,如Pod,Service,Volume,Namespace,ReplicaSet,Deployment,Job等等,设置需要部署多个组件,如依赖的数据库、中间件等。
下图为Wordpress应用程序中涉及到的kubernetes API对象。通过Helm将所有资源整合在一起,统一部署。

Helm Chart
Helm Chart就是Helm的包结构,helm Chart 不仅包含应用部署所涉及的所有yaml文件,而且可以在多个环境中通过引用不同的value文件实现跨环境部署。

一个Helm Chart一般文件结构如下:
nginx-chart/
|-- Chart.yaml # 包含有关 helm chart 的信息,如版本、名称、描述等
|-- charts # 主图表对其他图表有一定的依赖性,可以在此目录中添加另一个图表的结构。默认情况下,此目录为空。
|-- templates # 包含构成应用程序的所有 Kubernetes 清单文件。可以将这些清单文件模板化,以访问 values.yaml 文件中的值。
| |-- NOTES.txt # 一个纯文本文件,在成功部署图表后打印出来。
| |-- _helpers.tpl # 该文件包含多个方法和子模板。这些文件不会呈现给 Kubernetes 对象定义,但在其他图表模板中的任何地方都可以使用。
| |-- deployment.yaml
| |-- configmap.yaml
| |-- ingress.yaml
| |-- service.yaml
| `-- tests # 可以在图表中定义测试,以验证您的图表在安装时是否按预期工作。
| `-- test-connection.yaml
`-- values.yaml # 定义 YAML 模板的值,每个环境中只有该文件会更改
Helm 实践
以nginx为例创建一个Helm Chart并部署。
创建Chart样板
以nginx-chart命名
helm create nginx-chart
tree命令查看生成的文件夹,标准的Helm Chart结构。
nginx-chart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
修改Chart.yaml文件
apiVersion: v2 # 图表 API 版本。v2 用于 Helm 3,v1 用于以前的版本。
name: nginx-chart # Chart名称
description: My First Helm Chart # Chart描述
type: application #Chart类型可以是“应用程序”或“库”。应用程序图表是 Kubernetes 上部署的内容。库图表是可重复使用的图表,可与其他图表一起使用。编程中类似的库概念。
version: 0.1.0 # Chart版本
appVersion: "1.0.0" # 应用程序(Nginx)的版本号。每次对应用程序进行更改时,version appVersion 应该递增。
maintainers:
- email: contact@devopscube.com
name: devopscube
修改templates
修改templates文件夹中的应用部署文件,默认生成的文件都十分复杂,需要配置大量value,往往不是项目需要的;因此可以全部删掉,按照需求自己写各种部署文件。
以下为deployment文件写法:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: "nginx:1.16.0"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
上面的 YAML 文件,则值是静态的。helm chart 的想法是将 YAML 文件模板化,以便我们可以通过动态地为它们分配值来在多个环境中重用它们。
要对值进行模板化,只需在大括号内添加 object 参数,如下所示。它被称为模板指令,语法特定于 Go 模板
{{ .Object.Parameter }}
object包括三种:
- Release 发布:每个 helm 图表都将使用发布名称进行部署。如果要使用发布名称或访问模板中与发布相关的动态值,可以使用发布对象。
- Chart 图表:如果要使用 chart.yaml 中提到的任何值,可以使用图表对象。
- Value 值:values.yaml 文件中的所有参数都可以使用 Values 对象进行访问。

针对nginx的deployment文件,选择名称、副本、容器名称、图像和 imagePullPolicy动态加载。
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-nginx
labels:
app: nginx
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80
protocol: TCP
service.yaml同样配置设置。
apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-service
spec:
selector:
app: nginx
type: {{ .Values.service.type }}
ports:
- protocol: {{ .Values.service.protocol | default "TCP" }}
port: {{ .Values.service.port }}
targetPort: {{ .Values.service.targetPort }}
在协议模板指令中,可以看到一个管道。它用于将协议的默认值定义为 TCP。因此,这意味着我们不会在 values.yaml 文件中定义协议值,或者如果它为空,它将采用 TCP 作为协议的值。( | )
配置values.yaml
接下来配置values.yaml文件,补充deployment.yaml和service.yaml文件中的.Value参数。
replicaCount: 2
image:
repository: nginx
tag: "1.16.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 9000
targetPort: 80
env:
name: dev
至此所有文件编辑完成。
验证Helm Chart
为了确保Chart有效并且所有缩进都很好,可以运行以下命令。确保位于Chart目录中。
helm lint .
输出结果如下即可
==> Linting .
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed
部署Helm Chart
部署Chart时,Helm 将从文件中读取图表和配置值,并生成清单文件。然后它会将这些文件发送到 Kubernetes API 服务器,Kubernetes 将在集群中创建请求的资源。
helm install frontend nginx-chart
frontend即部署的Release Name。
部署后输出以下内容:
NAME: frontend
LAST DEPLOYED: Tue May 13 03:23:21 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
使用helm list可以查看部署的helm。
通过查看deployment、service可以确认应用和服务运行。
Helm升级和回滚
修改任何配置后,升级Helm应用,只需要执行
helm upgrade frontend nginx-chart
以下为输出结果,Revision值为2
Release "frontend" has been upgraded. Happy Helming!
NAME: frontend
LAST DEPLOYED: Tue May 13 03:28:28 2025
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
回滚可以使用rollback命令
helm rollback <release-name> <revision-number>
Helm Chart打包
helm package nginx-chart
查看本地文件可发现生成的nginx-chart-0.1.0.tgz文件

浙公网安备 33010602011771号