包管理工具Helm
认识Helm管理工具
Helm可以帮助我们管理Kubernetes应用程序,Helm Charts可以定义、安装和升级复杂的Kubernetes应用程序,就相当于centos中的yum以及ubuntu中的apt的存在。
安装Helm工具
下载地址:https://github.com/helm/helm/releases
根据自己系统下载对应的版本,下载完了之后解压,移动helm命令到PATH目录下
以我的mac amd64的系统为例:
tar zxf helm-v3.11.3-darwin-amd64.tar.gz
mv darwin-amd64/helm /usr/local/bin
安装成功后,我们可以查看版本:
➜ ~ helm version
version.BuildInfo{Version:"v3.11.3", GitCommit:"323249351482b3bbfc9f5004f65d400aa70f9ae7", GitTreeState:"clean", GoVersion:"go1.20.3"}
Helm操作
连接k8s群集
默认加载使用/root/.kube/config文件
#指定k8s群集的config文件
helm --kubeconfig k8s.config
简单查询基础操作
# 添加chart仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts/
# 查看已经添加的chart仓库列表
helm repo list
# 搜索可以安装的chart包
helm search repo stable
# 了解指定chart包的特性
helm show chart stable/mysql
# 查看chart包的values配置变量
helm show values stable/mysql
# 了解指定chart包的更多信息
helm show all stable/mysql
安装卸载下载操作
# 更新chart仓库
helm repo update
# 安装应用
helm install stable/mysql --generate-name
# 查看已经安装的release
helm ls
# 查看所有已经安装的release
helm ls -a
# 检索版本并查看实际加载的模板
helm get manifest mysql
# 卸载已经安装的release
helm uninstall mysql-1575619811
# 卸载已经安装的release以及历史记录
helm uninstall mysql-1575619811 --keep-history
# 下载chart包到本地
helm pull stable/mysql
# 上传chart包
helm push stable/mysql
Helm安装示例
当我们直接使用helm install时,会使用chart的默认配置选项,我们可以查看chart的可配置选项,并进行配置。
➜ ~ helm show values stable/mysql
## mysql image version
## ref: https://hub.docker.com/r/library/mysql/tags/
##
image: "mysql"
imageTag: "5.7.30"
busybox:
image: "busybox"
tag: "1.32"
testFramework:
enabled: true
image: "dduportal/bats"
tag: "1.2.1"
## Specify password for root user
##
## Default: random 10 character string
# mysqlRootPassword: testing
## Create a database user
##
# mysqlUser:
## Default: random 10 character string
# mysqlPassword:
## Allow unauthenticated access, uncomment to enable
##
# mysqlAllowEmptyPassword: true
## Create a database
##
# mysqlDatabase:
## Specify an imagePullPolicy (Required)
## It's recommended to change this to 'Always' if the image tag is 'latest'
## ref: http://kubernetes.io/docs/user-guide/images/#updating-images
##
imagePullPolicy: IfNotPresent
......
我们使用helm install命令来进行安装,如下所示:
helm install mysql stable/mysql
我们还可以自己设置参数来进行覆盖,如下所示:
# conifg.yaml
mysqlUser: admin
mysqlPassword: test123456
mysqlDatabase: test
persistence:
enabled: false
使用helm install -f进行安装,如下所示:
helm install -f config.yaml mysql stable/mysql
更多安装方式
#本地chart压缩包
helm install prometheus ./prometheus-11.12.1.tgz
#本地解压缩的chart目录
helm install prometheus ./prometheus
#在线的URL
helm install prometheus https://example.com/charts/prometheus-11.12.1.tgz
Helm Chart
Chart包介绍
Chart包是Helm(Kubernetes 的包管理工具)中的核心概念,用来打包、定义、安装和管理Kubernetes应用程序。Chart包是一个包含了Kubernetes资源定义文件(YAML)和相关元数据的压缩包。
Chart目录结构详解:
$ tree demo
demo
├── Chart.yaml # 描述chart相关信息,包括名称、api版本等
├── charts # 本chart包依赖的其他子chart包
├── templates # 存放用于K8s资源的所需要的yaml模版
│ ├── _helpers.tpl # 用于定义一些可重用的模板片断
│ ├── configmap.yaml
│ ├── deployment.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt # 用于安装后显示介绍chart部署后的一些信息
│ └── service.yaml
└── values.yaml # 存放用于资源清单模板传递写好的变量
内置对象
对象和代码(with 和 range语句)都可以通过模板引擎传递到模板之中。有几种方式可以在模板中创建新对象,比如说我们后面会看到的tuple功能。
一个简单的模板,如下所示:
# templates/congfigMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
key: {{ .Values.AccessKey }}
这里就用了Released对象,{{ .Release.Name }}在模板中插入版本名称。以及Values对象,{{ .Values.AccessKey }}在模板中引用了values.yaml的变量值。
Release
Release对象描述了版本发布本身。
对象列表如下:
Release.Name: release名称Release.Namespace: 版本中包含的命名空间(如果manifest没有覆盖的话)Release.IsUpgrade: 如果当前操作是升级或回滚的话,该值将被设置为trueRelease.IsInstall: 如果当前操作是安装的话,该值将被设置为trueRelease.Revision: 此次修订的版本号。安装时是1,每次升级或回滚都会自增Release.Service: 该service用来渲染当前模板。Helm里始终Helm
Values
Values对象是从values.yaml文件和用户提供的文件传进模板的,默认为空。
Chart
Chart.yaml文件内容。 Chart.yaml里的所有数据在这里都可以可访问的。比如 {{ .Chart.Name }}-{{ .Chart.Version }} 会打印出 myapp-1.0.0
对象列表如下:
- 在 Chart 指南 中列出了可获得属性
- 根据
Chart.yaml文件已经配置的变量来获取属性
Files
对象列表如下:
Files.Get:通过文件名获取文件的方法。 (.Files.Getconfig.ini)Files.GetBytes:用字节数组代替字符串获取文件内容的方法。 对图片之类的文件很有用Files.Glob:用给定的shell glob模式匹配文件名返回文件列表的方法Files.Lines:逐行读取文件内容的方法。迭代文件中每一行时很有用Files.AsSecrets:使用Base 64编码字符串返回文件体的方法Files.AsConfig:使用YAML格式返回文件体的方法
Capabilities
提供关于Kubernetes集群支持功能的信息
对象列表如下:
Capabilities.APIVersions:是一个版本列表Capabilities.APIVersions.Has $version:说明集群中的版本 (比如,batch/v1) 或是资源 (比如,apps/v1/Deployment) 是否可用Capabilities.KubeVersion和Capabilities.KubeVersion.Version:是Kubernetes的版本号Capabilities.KubeVersion.Major:Kubernetes的主版本Capabilities.KubeVersion.Minor:Kubernetes的次版本Capabilities.HelmVersion:包含Helm版本详细信息的对象,和helm version的输出一致Capabilities.HelmVersion.Version:是当前Helm语义格式的版本Capabilities.HelmVersion.GitCommit:Helm的git sha1值Capabilities.HelmVersion.GitTreeState:是Helm git树的状态Capabilities.HelmVersion.GoVersion:是使用的Go编译器版本
Template
包含当前被执行的当前模板信息
对象列表如下:
Template.Name:当前模板的命名空间文件路径 (e.g.mychart/templates/mytemplate.yaml)Template.BasePath:当前chart模板目录的路径 (e.g.mychart/templates)
Chart包详解
Chart.yaml
Chart.yaml文件是Helm Chart中的核心元数据文件,描述了这个Chart的名称、版本、作者、依赖等信息。它必须存在于每一个 Helm Chart 的根目录下。
文件内容及解析如下:
# Chart.yaml
apiVersion: v2 # 必填,Chart包的API版本,Helm3使用v2
name: myapp # 必填,Chart包名称
version: 1.0.1 # 必填,Chart包版本,符合semver规范
description: A Helm chart for deploying myapp # 可选,描述信息
type: application # 可选,Chart 类型:application(默认)或 library
appVersion: "2.3.4" # 可选,应用自身的版本(非Chart的版本)
icon: https://example.com/icon.png # 可选,图标URL,在Helm仓库UI中展示用
deprecated: # 可选: 标记该 chart 已废弃,使用方法为布尔值
keywords: # 可选,关键词,可用于搜索
- web
- nginx
- backend
home: https://myapp.example.com # 可选,项目主页地址
sources: # 可选,源码地址
- https://github.com/example/myapp
maintainers: # 可选,维护者列表
- name: 张三
email: zhangsan@example.com
- name: 李四
email: xxxxx
dependencies: # 可选,子Chart包依赖
- name: redis
version: "14.8.8" # 子chart包版本
repository: "https://charts.bitnami.com/bitnami" # 仓库完整地址
alias: cache # 可选,依赖chart的别名
tags: # 可选: 用于一次启用/禁用 一组chart的tag
- xxx
- xxx
annotations: # 可选,自定义注解,可用于额外元信息
category: backend
support: support@example.com
values文件
values文件了解
values文件的内容可以来自多个位置,values文件的来源如下所示:
- chart中
values.yaml文件 - 如果是子chart,就是父chart中的
values.yaml文件 - 使用
helm install -f命令指定values文件(比如helm install -f myvals.yaml ./mychart)传递到helm install或helm upgrade的values文件 - 使用
helm install --set命令(比如helm install --set foo=bar ./mychart)传递的单个参数
values文件优先级:
- 最高:
helm install --set命令 - 第二:
helm install -f命令 - 第三:父chart的
values.yaml文件 - 最后:默认使用
values.yaml文件
模板中使用values文件变量
在values.yaml文件中设置参数,文件内容如下:
# values.yaml
dataCode: apple
data:
key: 1a055f26f5f821a4f1a738bcafca8cdd
添加模板,在模板中应用变量,如下所示:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
key: {{ .Values.data.key }}
code: {{ .Values.dataCode }}
使用helm install命令安装测试,看看是如何渲染的:
$ helm install myapp myapp/ --dry-run --debug
install.go:224: 2025-07-28 15:08:39.592538 +0800 CST m=+0.021493793 [debug] Original chart version: ""
install.go:241: 2025-07-28 15:08:39.592572 +0800 CST m=+0.021527501 [debug] CHART PATH: /Users/devops/Downloads/myapp
NAME: myapp
LAST DEPLOYED: Mon Jul 28 15:08:39 2025
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
data:
key: 1a055f26f5f821a4f1a738bcafca8cdd
dataCode: apple
HOOKS:
MANIFEST:
---
# Source: myapp/templates/configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-configmap
data:
key: 1a055f26f5f821a4f1a738bcafca8cdd
code: apple
使用–set和删除默认的key
1.使用–set参数
根据上面的例子我们使用--set来覆盖value的值,查看效果如下:
$ helm install myapp myapp/ --dry-run --debug --set dataCode=banana
install.go:224: 2025-07-28 15:14:39.815848 +0800 CST m=+0.021410543 [debug] Original chart version: ""
install.go:241: 2025-07-28 15:14:39.815894 +0800 CST m=+0.021457043 [debug] CHART PATH: /Users/devops/Downloads/myapp
NAME: myapp
LAST DEPLOYED: Mon Jul 28 15:14:40 2025
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
dataCode: banana
COMPUTED VALUES:
data:
key: 1a055f26f5f821a4f1a738bcafca8cdd
dataCode: banana
HOOKS:
MANIFEST:
---
# Source: myapp/templates/configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-configmap
data:
key: 1a055f26f5f821a4f1a738bcafca8cdd
code: banana
由于--set比默认的values.yaml文件优先级更高,模板就生成了code: banana。
2.删除默认的key
在Kubernetes的项目部署中,我们如果需要从默认的value中删除key,可以将key设置为null,Helm将在覆盖的value合并时删除这个key。
比如:我们在项目中设置的探针配置,默认值为httpGet,我们想要换成exec方式,如下所示:
原来的结构:
livenessProbe:
httpGet:
path: /ping
port: http
failureThreshold: 3
periodSeconds: 10
使用--set livenessProbe.exec.command=[curl, -I, localhost/ping],Helm会把默认的key和重写的key合并在一起,生成文件内容如下所示:
livenessProbe:
httpGet:
path: /ping
port: http
exec:
command:
- curl
- -I
- localhost/ping
failureThreshold: 3
periodSeconds: 10
在Kubernetes中这样的探针句柄是错误的,所以会部署失败。解决这个问题的办法就是通过设定null来删除livenessProbe.httpGet更正句柄语法。命令如下:
helm install stable/myapp --set livenessProbe.exec.command=[curl,-I,localhost/ping] --set livenessProbe.httpGet=null
创建一个NOTES.txt文件
创建一个NOTES.txt文件可以为chart用户提供说明的Helm工具。在helm install或helm upgrade命令的最后,Helm会打印出对用户有用的信息。 使用模板可以高度自定义这部分信息。要在chart添加安装说明,只需创建templates/NOTES.txt文件即可。
首先我们先在templates目录下创建一个NOTES.txt文件,如下所示:
# NOTES.txt
Thank you for installing {{ .Chart.Name }}.
Your release is named {{ .Release.Name }}.
Chart Version is {{ .Chart.Version }}
To learn more about the release, try:
$ helm status {{ .Release.Name }}
$ helm get all {{ .Release.Name }}
再使用helm install命令安装,如下所示:
```bash
$ helm install myapp myapp/
NAME: myapp
LAST DEPLOYED: Mon Jul 28 15:52:43 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing myapp.
Your release is named myapp.
Chart Version is 1.0.0
To learn more about the release, try:
$ helm status myapp
$ helm get all myapp
我们能在安装信息中看到我们配置的信息以及给用户提供关于如何使用新安装的chart细节信息的好方法,强烈建议创建一个NOTES.txt文件。
函数语法
常用函数
1.quote
加引号(常用于防止 YAML 字符串格式问题)
# values.yaml配置
Key: afe105eb4dc2dac3d020453aeb2e6d8f
# configMap.yaml语法配置
key: {{ .Values.Key |quote }}
# 渲染效果
data:
key: "afe105eb4dc2dac3d020453aeb2e6d8f"
2.default
如果变量不存在,则使用默认值。
# configMap.yaml语法配置
info: {{ default "no infomation!" .Values.info }}
# 渲染效果
data:
info: no infomation!
3.required
确保某个变量必须存在,否则报错。
# values.yaml配置
AccessKey: YWZlMTA1ZWI0ZGMyZGFjM2QwMjA0NTNhZWIyZTZkOGY
# configMap.yaml语法配置
accesskey: {{ required "AccessKey is required" .Values.AccessKey }}
# 渲染效果
data:
accesskey: YWZlMTA1ZWI0ZGMyZGFjM2QwMjA0NTNhZWIyZTZkOGY
4.lookup
运行时获取集群中的资源(仅Helm v3.1+版本)
| 命令 | Lookup 函数 |
|---|---|
kubectl get pod mypod -n mynamespace |
lookup “v1” “Pod” “mynamespace” “mypod” |
kubectl get pods -n mynamespace |
lookup “v1” “Pod” “mynamespace” “” |
kubectl get pods --all-namespaces |
lookup “v1” “Pod” “” “” |
kubectl get namespace mynamespace |
lookup “v1” “Namespace” “” “mynamespace” |
kubectl get namespaces |
lookup “v1” “Namespace” “” “” |
示例如下:
# values.yaml
Key: afe105eb4dc2dac3d020453aeb2e6d8f
# configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: test-configmap
data:
accesskey: YWZlMTA1ZWI0ZGMyZGFjM2QwMjA0NTNhZWIyZTZkOGY
# deployment.yaml语法配置
env:
- name: APPKEY
{{- $config := lookup "v1" "ConfigMap" "default" "test-configmap" }}
{{- $AccessKey := "" }}
{{- if and $config $config.data }}
{{- $AccessKey = $config.data.accesskey }}
{{- else }}
{{- $AccessKey = .Values.Key }}
{{- end }}
value: {{ $AccessKey |quote }}
# 渲染效果
containers:
- env:
- name: APPKEY
value: YWZlMTA1ZWI0ZGMyZGFjM2QwMjA0NTNhZWIyZTZkOGY
5.printf
格式化字符串(如 Go 的 fmt.Printf)
# values.yaml配置
image:
repository: nginx
tag: 1.29.0
# deployment.yaml语法配置
image: {{ printf "%s:%s" .Values.image.repository .Values.image.tag }}
# 渲染效果
image: nginx:1.29.0
6.upper
将字符串全部转换为大写字母。
# configMap.yaml语法配置
data:
info: {{ upper apple |quote }}
# 渲染效果
data:
info: "APPLE"
7.toYaml / toJson
将对象序列化为 YAML/JSON(多用于嵌套结构)
# values.yaml配置
env:
- name: MYSQL_HOST
value: 192.168.100.101
# deployment.yaml语法配置
env:
{{ toYaml .Values.env | indent 10 }}
# 渲染效果
env:
- name: MYSQL_HOST
value: 192.168.100.101
8.include和template
复用模板块。搭配 define 使用。
# values.yaml配置
appName: demo
# deployment.yaml语法配置
{{- define "myapp.labels" }}
labels:
app: {{ .Values.appName }}
{{- end }}
# 在别处使用:
{{- include "myapp.labels" . | indent 2 }}
# 渲染效果
labels:
app: demo
9.indent / nindent
indent:将字符串每一行缩进 N 个空格(不添加换行),nindent:先换行再缩进 N 个空格。
# values.yaml配置
config:
- name: MYSQL_HOST
value: 192.168.100.101
- name: MYSQL_PORT
value: 3306
# deployment.yaml语法配置
env:
{{ toYaml .Values.config | nindent 10 }}
# 渲染效果
env:
- name: MYSQL_HOST
value: 192.168.100.101
- name: MYSQL_PORT
value: 3306
10.dict / list
动态创建字典和列表,结合 with/range 使用。
# values.yaml配置
env:
A: dnhdsahduhd
B: djsaidhasui
# deployment.yaml语法配置
{{- $envs := list }}
{{- if .Values.env.A }}
{{- $envs = append $envs (dict "name" "ENV_A" "value" .Values.env.A) }}
{{- end }}
{{- if .Values.env.B }}
{{- $envs = append $envs (dict "name" "ENV_B" "value" .Values.env.B) }}
{{- end }}
env:
{{- toYaml $envs | nindent 10 }}
# 渲染效果
env:
- name: ENV_A
value: dnhdsahduhd
- name: ENV_B
value: djsaidhasui
流程控制语法
条件判断
# values.yaml配置
livenessProbeType: httpGet
# service.yaml语法配置
{{- if eq .Values.livenessProbeType "httpGet" }}
httpGet:
path: /ping
port: 80
{{- else if eq .Values.livenessProbeType "tcpSocket" }}
tcpSocket:
port: 80
{{- else }}
exec:
command:
- /bin/sh
- -c
- "curl -f http://localhost:8080/ping || exit 1"
{{- end }}
# 渲染效果
# Source: myapp/templates/deployment.yaml
......
containers:
- name: demo
image: nginx:latest
livenessProbe:
httpGet:
path: /ping
port: 80
failureThreshold: 3
periodSeconds: 5
timeoutSeconds: 10
遍历range
# values.yaml配置
servicePort:
ports:
- port: 80
protocol: TCP
targetPort: 80
- port: 8080
protocol: TCP
targetPort: 8080
# service.yaml语法配置
{{- range .Values.servicePort.ports }}
- port: {{ .port }}
protocol: {{ .protocol }}
targetPort: {{ .targetPort }}
{{- end }}
# 渲染效果
......
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: myapp
sessionAffinity: None
type: ClusterIP
with
将当前的作用域(上下文)切换为某个对象,并在该作用域中简化访问,相当于linux中的cd命令。
# values.yaml配置
image:
repository: nginx
tag: latest
# deployment.yaml语法配置
{{- with .Values.image }}
image: {{ .repository }}:{{ .tag }}
{{- end }}
# 渲染效果
# Source: myapp/templates/deployment.yaml
......
containers:
- name: demo
image: nginx:latest
子Chart包
所谓的子chart包就是在chart包中charts/目录下的依赖包,有自己的值和模板,可以是自己创建一个chart包,也可以是三方下载依赖包的形式。
创建子Chart包
命令如下所示:
cd myapp/charts
helm create subchart
rm -rf subchart/templates/*
myapp/charts/subchart应该已经有一个values.yaml,需要配置子chart包的Values对象可以对其进行配置。
子chart包的特性:
- 1.子chart被认为是独立的,意味着子chart从来不会显示依赖它的父chart。
- 2.因此,子chart无法访问父chart的值。
- 3.父chart可以覆盖子chart的值。
- 4.Helm有一个全局值的概念,所有的chart都可以访问。
用父Chart的值来覆盖
我们先配置子chart包的values.yaml文件,如下所示:
# myapp/charts/subchart/values.yaml
dataCode: i love apple
我们单独测试安装子chart包,
$ helm install myapp/charts/subchart --generate-name --dry-run --debug
install.go:224: 2025-07-28 17:48:22.185592 +0800 CST m=+0.020308085 [debug] Original chart version: ""
install.go:241: 2025-07-28 17:48:22.185627 +0800 CST m=+0.020343501 [debug] CHART PATH: /Users/devops/Downloads/myapp/charts/subchart
NAME: subchart-1753696102
LAST DEPLOYED: Mon Jul 28 17:48:22 2025
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
dataCode: i love apple
HOOKS:
MANIFEST:
---
# Source: subchart/templates/configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: subchart-1753696102-configmap
data:
code: i love apple
myapp是subchart的父级,可以在myapp指定配置并将配置推送到subchart。比如可以修改myapp/values.yaml文件,内容如下:
# myapp/values.yaml
subchart:
dataCode: i like ice cream
我们再进行测试,发现子chart的值已经被顶层的值覆盖了。如下所示:
$ helm install myapp myapp/charts/subchart --dry-run --debug
install.go:224: 2025-07-28 17:44:20.915114 +0800 CST m=+0.019972334 [debug] Original chart version: ""
install.go:241: 2025-07-28 17:44:20.915149 +0800 CST m=+0.020007376 [debug] CHART PATH: /Users/devops/Downloads/myapp/charts/subchart
NAME: myapp
LAST DEPLOYED: Mon Jul 28 17:44:21 2025
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
dataCode: i like ice cream
HOOKS:
MANIFEST:
---
# Source: subchart/templates/configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-configmap
data:
code: i like ice cream
全局Chart值
全局值是使用完全一样的名字在所有的chart及子chart中都能访问的值。全局变量需要显式声明。不能将现有的非全局值作为全局值使用。
我们将这些值数据保留在.Values.global中,用来设置全局值,在父级chart下的values.yaml文件中。如下所示:
# myapp/values.yaml
global:
fileData: I am global data!
因为全局的工作方式,myapp/templates/configMap.yaml和myapp/charts/subchart/templates/configMap.yaml 应该都能以{{ .Values.global.fileData }}进行访问。我们进行测试,结果如下:
---
$ helm install myapp myapp/ --dry-run --debug
......
# Source: myapp/charts/subchart/templates/configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-configmap
data:
code: i love apple
data: I am global data!
---
# Source: myapp/templates/configMap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-configmap
data:
code: i like ice cream
data: I am global data!
更新依赖包
# Chart.yaml
dependencies:
- name: redis # redis子包信息
version: 10.5.7
repository: http://mirror.azure.cn/kubernetes/charts/
alias: cache
tags:
- xxx
- xxx
- name: mysql # mysql子包信息
version: 1.6.9
repository: http://mirror.azure.cn/kubernetes/charts/
依赖的 chart 包 会被下载到charts/目录下,如下所示:
$ helm dependency update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "bitnami" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
Saving 2 charts
Downloading redis from repo http://mirror.azure.cn/kubernetes/charts/
Downloading mysql from repo http://mirror.azure.cn/kubernetes/charts/
Deleting outdated charts
$ tree charts
charts
├── mysql-1.6.9.tgz
└── redis-10.5.7.tgz
1 directory, 2 files
还会生成一个.lock文件,如下所示:
# Chart.lock
$ cat Chart.lock
dependencies:
- name: redis
repository: http://mirror.azure.cn/kubernetes/charts/
version: 10.5.7
- name: mysql
repository: http://mirror.azure.cn/kubernetes/charts/
version: 1.6.9
digest: sha256:1580e25da7dea05cea6304b802336150dbd4e2d31fab6b289311bd34217eb0c0
generated: "2025-07-28T11:40:03.365989+08:00"
或者使用helm pull命令拉取到charts/目录下,如下所示:
cd myapp/charts
helm pull bitnami/redis --version 10.5.7
helm pull bitnami/mysql --version 1.6.9