Kubernetes 的包管理工具——Helm
安装一个 Chart 时,Helm 会结合你的配置参数,将 Chart 中的模板渲染成真正的 Kubernetes YAML 文件,并将其提交给 API Server,从而在集群中创建出具体的资源(如 Pod, Service 等)。同一个 Chart 可以被安装多次,每次安装都会生成一个独立的 Release。:一个 Helm 软件包,包含了在 Kubernetes 上运行一个应用所需的所有资源
一、Helm 基本概念
Helm 是 Kubernetes 的包管理器,您可以将其类比为 Linux 系统中的 yum 或 apt,或者 Python 中的 pip。它的核心目标是简化 Kubernetes 应用的打包、分发、部署和生命周期管理。
Helm 有三个核心概念:
1、Chart
-
是什么:一个 Helm 软件包,包含了在 Kubernetes 上运行一个应用所需的所有资源定义。
-
类比:类似于
apt的.deb包 或yum的.rpm包。 -
内容:它是一个目录的集合,里面包含了一系列 YAML 模板文件和一些默认配置。
-
结构:
mychart/
├── Chart.yaml # Chart 自身的元信息,如名称、版本等
├── values.yaml # 默认的配置参数
├── charts/ # 依赖的其他 Chart(子 Chart)
└── templates/ # 模板文件目录,包含 Deployment, Service, Ingress 等 Kubernetes 资源清单的模板
├── deployment.yaml
├── service.yaml
└── ...
2、Release
-
是什么:在 Kubernetes 集群中运行的 Chart 的一个实例。
-
类比:安装软件包后,在系统中运行的一个具体进程。
-
解释:当你使用
helm install安装一个 Chart 时,Helm 会结合你的配置参数,将 Chart 中的模板渲染成真正的 Kubernetes YAML 文件,并将其提交给 API Server,从而在集群中创建出具体的资源(如 Pod, Service 等)。这个被部署出来的应用就是一个 Release。同一个 Chart 可以被安装多次,每次安装都会生成一个独立的 Release。
3、Repository
-
是什么:Chart 的存放仓库,用于存储和共享 Chart。
-
类比:类似于 Docker Hub 或 Maven Central。
-
作用:你可以从公共的或私有的 Repository 中查找、下载和上传 Chart。
二、Helm 的核心作用
1、简化复杂应用的部署
-
一个微服务应用可能包含几十个 Kubernetes 资源(Deployment, Service, ConfigMap, Secret, Ingress 等)。手动管理这些 YAML 文件极其繁琐且容易出错。Helm 将它们打包成一个 Chart,实现一键部署。
2、管理应用依赖
-
Chart 可以声明依赖其他 Chart(例如,一个 Web 应用依赖 Redis 和 PostgreSQL)。Helm 会自动帮你下载和安装这些依赖。
3、版本化管理与升级回滚
-
Chart 本身有版本,Release 也有版本。你可以轻松地:
-
helm upgrade:升级应用到新版本。 -
helm rollback:回滚到之前的任何一个版本。 -
helm history:查看一个 Release 的发布历史。
-
4、参数化配置
-
这是 Helm 最强大的特性之一。通过 Go 模板语言 和
values.yaml文件,可以将配置与模板分离。 -
模板化:在
templates/目录下的 YAML 文件中,使用{{ .Values.parameter }}的语法来引用变量。 -
值文件:在
values.yaml中为这些变量提供默认值。用户可以在安装时通过-f custom-values.yaml或--set key=value来覆盖这些默认值,实现一份模板,多处部署(如开发、测试、生产环境使用不同配置)。
三、Helm 配置详解(以 values.yaml 为例)
values.yaml 是 Helm Chart 的默认配置文件。它定义了所有可配置的参数。
一个典型的 values.yaml 示例:
# values.yaml
# 副本数
replicaCount: 2
# 镜像配置
image:
repository: nginx
pullPolicy: IfNotPresent
tag: "latest"
# 服务配置
service:
type: ClusterIP
port: 80
# 资源限制
resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
# 自动扩缩容 (HPA) 配置
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 80
# ingress 配置
ingress:
enabled: false
className: "nginx"
hosts:
- host: chart-example.local
paths:
- path: /
pathType: Prefix
对应的模板文件 templates/deployment.yaml 片段:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-deployment
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 80
resources:
{{- toYaml .Values.resources | nindent 12 }}
如何使用自定义配置:
# 1. 使用自定义的 values 文件
helm install my-app ./my-chart -f production-values.yaml
# 2. 在命令行直接覆盖某个值
helm install my-app ./my-chart --set replicaCount=3 --set image.tag="v1.2.3"
# 3. 两者结合
helm install my-app ./my-chart -f production-values.yaml --set resources.limits.cpu=500m
四、经典案例:使用 Helm 部署 WordPress
这个案例完美展示了 Helm 如何管理一个复杂的、有状态的应用。
步骤:
1、添加 Bitnami 仓库(一个流行的 Helm 公共仓库)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
2、查找并查看 WordPress Chart
helm search repo wordpress
helm show values bitnami/wordpress > my-values.yaml
3、定制化配置(编辑 my-values.yaml)
# my-values.yaml
wordpressUsername: admin
wordpressPassword: "my-strong-password"
wordpressEmail: admin@example.com
# 使用外部数据库,而不是 Chart 内嵌的(生产环境推荐)
mariadb:
enabled: false
externalDatabase:
host: my-production-mysql
user: wordpress
password: "mysql-password"
database: wordpress
# 配置持久化存储
persistence:
enabled: true
size: 20Gi
# 配置 Service 类型为 LoadBalancer,以便从外部访问
service:
type: LoadBalancer
4、安装 WordPress
helm install my-wordpress bitnami/wordpress -f my-values.yaml
-
这个命令会创建一个名为
my-wordpress的 Release。 -
Helm 会根据 Chart 和你的
my-values.yaml,创建出包括 WordPress Pod、Service、PersistentVolumeClaim(如果需要)等在内的所有资源。
5、查看发布状态
helm list
helm status my-wordpress
kubectl get pods,svc,pvc
6、升级与回滚
# 升级:将 WordPress 镜像版本升级到指定版本
helm upgrade my-wordpress bitnami/wordpress -f my-values.yaml --set image.tag=6.2
# 查看历史
helm history my-wordpress
# 回滚:如果升级后出现问题,回滚到上一个版本
helm rollback my-wordpress 1
7、卸载
helm uninstall my-wordpress
# 注意:默认情况下,Helm 不会删除 PVC,以防止数据丢失。需要手动删除。
通过这个案例,你可以看到 Helm 如何将部署一个包含 Web 服务器和数据库的复杂应用,简化成几个简单的命令,并且能轻松地进行配置管理和版本控制。
总结
| 特性 | 解决的问题 | 核心命令 |
|---|---|---|
| 打包 | 管理大量分散的 YAML 文件 | helm create, helm package |
| 分发 | 共享和复用应用部署模板 | helm repo add/update, helm pull |
| 部署 | 一键部署复杂应用 | helm install |
| 配置管理 | 环境差异化配置 | -f values.yaml, --set |
| 生命周期管理 | 应用升级、回滚、卸载 | helm upgrade, helm rollback, helm uninstall |
Helm 是现代 Kubernetes 技术栈中不可或缺的一环,是实现 GitOps 和 应用交付自动化 的基石工具。
更多推荐


所有评论(0)