1. 概述
Helm Chart 是一种用于打包 Kubernetes 应用的标准格式,便于分发和部署。通过 Helm Chart,我们可以将应用所需的所有 Kubernetes 资源打包在一起,简化最终用户的安装流程。用户只需运行一个命令 helm install
,即可完成整个应用的部署。
关键在于,我们可以对 Helm Chart 进行参数化,使其具备高度可配置性。这样就可以将与环境相关的配置项抽离出来,使得同一个 Chart 可以在不同环境中灵活部署。
本教程将介绍如何对 Helm Chart 进行参数化,使其具备可配置能力。
2. Helm Chart 的参数化方式
Helm Chart 由多个 Kubernetes 资源模板组成。在模板中,我们可以为字段设置静态值,也可以通过引用 Helm 提供的内置对象来实现参数化。看一个 Deployment 的例子:
$ cat templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name }}-deployment
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Chart.Name }}
spec:
containers:
- name: {{ .Chart.Name }}-container
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 80
上面这个 Deployment 模板中,我们使用了 Helm 的 Values
和 Chart
内置对象来实现字段的参数化。例如:
replicas
字段引用了Values.replicaCount
,这意味着在安装时可以动态配置副本数;name
字段引用了Chart.Name
,确保部署名称与 Chart 名称一致;containerPort
是静态值,所有安装实例中都会保持一致。
下面我们详细介绍这些内置对象。
2.1 Values
内置对象
Values
是 Helm 中最常用的内置对象,用于加载安装时传入的变量值。它支持以下几种传值方式:
- 默认值文件:在 Chart 目录中定义
values.yaml
,提供默认配置; - 外部值文件:通过
-f
参数传入自定义配置文件,例如:helm install -f values-standalone.yaml
- 命令行参数:通过
--set
直接传参,例如:helm install --set replicaCount=3
优先级顺序为:--set
> -f
> values.yaml
。也就是说,命令行传参会覆盖外部文件,外部文件又会覆盖默认值文件。
2.2 Chart
内置对象
Chart
对象用于访问 Chart.yaml
中定义的元数据,比如 Chart 名称、版本号等。例如:
$ cat templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name }}-deployment
labels:
app: {{ .Chart.Name }}
version: {{ .Chart.AppVersion }}
spec:
...
这种做法的好处是,当 Chart.yaml
中的名称或版本变更时,模板中的相关内容会自动更新,无需手动修改。
3. 实战演示:配置 Helm Chart 安装
3.1 创建 Helm Chart
我们以一个简单的 Web 应用为例,展示如何通过参数化实现不同环境下的灵活部署。
首先创建目录并进入:
mkdir web && cd web
创建 Chart.yaml
文件:
apiVersion: v2
name: web
description: A simple web application
version: 0.1.0
appVersion: "0.1.0"
然后创建 Deployment 模板:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name }}-deployment
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Chart.Name }}
spec:
containers:
- name: ubuntu-container
image: ubuntu:latest
command: ["sleep", "infinity"]
3.2 定义默认值文件
创建 values.yaml
,设置默认副本数为 1:
replicaCount: 1
3.3 安装 Helm Chart(开发环境)
执行安装命令:
helm install -n dev web-dev .
验证部署结果:
kubectl get po -n dev
预期结果:部署一个 Pod。
3.4 自定义配置(生产环境)
创建 values-prod.yaml
文件,设置副本数为 2:
replicaCount: 2
执行安装命令并指定命名空间和配置文件:
helm install -n prod -f values-prod.yaml web-prod .
验证部署结果:
kubectl get po -n prod
预期结果:部署两个 Pod。
4. 小结 ✅
本教程我们学习了 Helm Chart 的参数化机制,包括:
- 使用
Values
内置对象实现字段的动态配置; - 使用
Chart
对象引用 Chart 元数据; - 通过
values.yaml
、-f
和--set
三种方式传值; - 通过一个完整的 Helm Chart 演示了如何在不同环境中灵活部署应用。
通过参数化,我们可以实现 Chart 的高度可复用性,避免重复开发和配置错误,是 Helm 使用中非常关键的一环。