Helm 安装与使用:快速上手 Kubernetes 包管理
在现代云原生应用的版图中,Kubernetes (K8s) 已然成为容器编排的事实标准。它提供了强大的功能来部署、扩展和管理容器化应用程序。然而,随着应用复杂性的增加,管理构成应用程序的众多 Kubernetes 资源(如 Deployments, Services, ConfigMaps, Secrets 等)本身就变成了一项挑战。手动编写、维护和部署大量的 YAML 文件不仅耗时,而且容易出错,难以版本化和复用。
为了解决这些痛点,社区引入了 Helm——Kubernetes 的包管理器。Helm 允许开发者和运维人员将应用程序及其依赖项打包成一种称为 Chart 的格式,然后通过简单的命令来安装、升级、回滚和卸载这些应用程序。这极大地简化了 Kubernetes 应用的生命周期管理,提高了部署效率和可靠性。
本文将详细介绍 Helm 的安装过程,并通过实际操作演示其核心功能,帮助您快速上手 Helm,提升 Kubernetes 应用管理能力。
一、 为什么需要 Helm?理解 Helm 的价值
在深入了解如何使用 Helm 之前,我们先明确它解决了哪些核心问题:
- 复杂性管理 (Complexity Management): 一个典型的微服务应用可能包含数十个甚至上百个 Kubernetes 资源。Helm Chart 将这些资源模板化并组织在一起,形成一个逻辑单元,使得管理更加清晰。
- 可重用性 (Reusability): Helm Chart 是参数化的。你可以创建一份通用的 Chart,然后通过不同的配置(Values)在不同环境(开发、测试、生产)或为不同租户部署同一应用,无需复制粘贴和修改大量 YAML。
- 版本控制 (Versioning): Helm 对 Chart 和部署实例(Release)都进行版本管理。你可以轻松地追踪应用程序部署的版本,并在需要时回滚到之前的稳定版本。
- 依赖管理 (Dependency Management): 复杂的应用通常依赖于其他服务(如数据库、缓存)。Helm Chart 可以声明其依赖关系,Helm 会负责按正确的顺序安装和管理这些依赖。
- 生命周期管理 (Lifecycle Management): Helm 提供了一套完整的命令来管理应用的整个生命周期,包括安装 (
install
)、升级 (upgrade
)、回滚 (rollback
)、卸载 (uninstall
) 以及查看状态 (status
) 和历史 (history
)。 - 分享与协作 (Sharing & Collaboration): Helm Chart 可以被打包并托管在公共或私有的 Chart 仓库中(如 Artifact Hub, ChartMuseum),方便团队成员或社区共享和复用标准化的应用部署方案。
二、 Helm 核心概念与架构 (Helm v3)
理解 Helm 的几个核心概念对于有效使用至关重要:
- Chart: Helm 的打包格式。它是一个包含了一系列文件的目录,这些文件描述了一组相关的 Kubernetes 资源。可以将其类比为 Linux 系统中的 RPM 或 DEB 包,或是 Node.js 中的 npm 包。
- Repository (仓库): 用于存储和分发 Chart 的地方。Helm 客户端可以配置多个仓库,并从中搜索和下载 Chart。官方维护了一个公共仓库,许多公司和项目也维护自己的仓库。
- Release: 在 Kubernetes 集群上运行的一个 Chart 的实例。每次使用
helm install
命令安装一个 Chart 时,就会创建一个新的 Release。同一个 Chart 可以用不同的配置(Values)多次安装,每次都会生成一个唯一的 Release Name。 - Values: Chart 的配置参数。Chart 的模板中使用了占位符,这些占位符的值在安装或升级时通过 Values 文件或命令行参数提供。这使得 Chart 可以灵活适应不同环境和需求。
values.yaml
文件是 Chart 中定义默认配置的地方。 - Template: Chart 中的核心部分,位于
templates/
目录下。这些是包含 Go 模板语言(Go template language)的 Kubernetes YAML 文件。Helm 的模板引擎会读取values.yaml
中的配置,结合模板文件,最终渲染生成可部署到 Kubernetes 集群的标准 YAML 清单。
Helm v3 架构: 值得注意的是,本文主要基于 Helm v3。与 Helm v2 不同,Helm v3 移除了服务端组件 Tiller,采用了客户端-库(Client-Library)架构。这意味着 Helm v3 的安全性模型直接依赖于 Kubernetes RBAC,操作权限与执行 helm
命令的用户权限一致,简化了架构并提高了安全性。所有 Release 的状态信息现在直接存储在 Kubernetes 集群的 Secrets 资源中(默认存储在部署的 Namespace 下)。
三、 安装 Helm 客户端
Helm 是一个命令行工具,需要在能够访问 Kubernetes 集群的机器上安装。以下是几种常见的安装方式:
1. 使用官方脚本 (推荐,适用于 Linux/macOS):
这是最简单快捷的方式。打开终端,执行以下命令:
bash
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
该脚本会自动检测你的操作系统和架构,下载最新的 Helm v3 发行版,并将其安装到 /usr/local/bin/helm
(或类似的标准路径)。
2. 使用包管理器:
- macOS (使用 Homebrew):
bash
brew install helm - Windows (使用 Chocolatey):
bash
choco install kubernetes-helm - Linux (使用 Snap):
bash
sudo snap install helm --classic - Linux (使用 Apt – 可能不是最新版):
某些 Linux 发行版的仓库可能包含 Helm,但版本可能较旧。
bash
sudo apt-get update && sudo apt-get install helm
3. 手动下载二进制文件:
访问 Helm 的 GitHub Releases 页面 (https://github.com/helm/helm/releases),下载适合你操作系统的预编译二进制包(.tar.gz
或 .zip
)。解压后,将 helm
可执行文件移动到你的 PATH
环境变量包含的目录下(如 /usr/local/bin
或 ~/bin
)。
验证安装:
安装完成后,打开新的终端窗口,运行以下命令验证 Helm 是否安装成功并查看版本信息:
bash
helm version
你应该能看到类似如下的输出(版本号可能不同):
version.BuildInfo{Version:"v3.10.1", GitCommit:"...", GitTreeState:"clean", GoVersion:"go1.19.3"}
确保你的 kubectl
已经配置好,并且可以连接到你的 Kubernetes 集群 (kubectl cluster-info
)。Helm 需要通过 kubectl
的配置(通常是 ~/.kube/config
文件)来与集群通信。
四、 Helm 基本使用流程
现在我们已经安装好了 Helm,让我们通过一个实际例子来体验其基本用法。我们将使用一个公共 Chart 仓库中的 bitnami/nginx
Chart。
1. 添加 Chart 仓库:
Helm 需要知道去哪里查找 Chart。我们需要添加包含 nginx
Chart 的 Bitnami 仓库。
bash
helm repo add bitnami https://charts.bitnami.com/bitnami
命令执行成功后会提示 "bitnami" has been added to your repositories
。你可以使用 helm repo list
查看已添加的仓库列表。
2. 更新仓库缓存:
添加仓库后,最好更新一下本地的仓库缓存,以获取最新的 Chart 列表。
bash
helm repo update
3. 搜索 Chart:
现在可以搜索仓库中的 Chart 了。例如,搜索包含 “nginx” 的 Chart:
bash
helm search repo nginx
你会看到一个列表,其中应该包含 bitnami/nginx
。
4. 查看 Chart 信息:
在安装之前,了解 Chart 的详细信息通常很有用。
-
查看 Chart 的基本信息:
bash
helm show chart bitnami/nginx
这将显示Chart.yaml
文件的内容,包括 Chart 版本、描述、维护者等。 -
查看 Chart 的默认配置 (Values):
bash
helm show values bitnami/nginx
这将显示values.yaml
文件的内容。仔细阅读这些配置项,了解可以自定义哪些参数,例如 Service 类型、副本数量、镜像版本、资源限制等。 -
查看 Chart 的模板文件 (可选):
bash
helm show readme bitnami/nginx # 查看 README 文档
# 或者下载 Chart 到本地进行查看
helm pull bitnami/nginx --untar # 下载并解压 Chart 到当前目录
# 然后可以查看 templates/ 目录下的文件
5. 安装 Chart (创建 Release):
使用 helm install
命令来部署 Chart。你需要为这次部署指定一个 Release 名称,并选择要安装的 Chart。
“`bash
语法: helm install [flags]
示例:在 ‘default’ namespace 中安装 nginx,Release 名为 ‘my-nginx’
helm install my-nginx bitnami/nginx
“`
Helm 会将 Chart 模板与默认的 Values 结合,渲染成 Kubernetes YAML 清单,然后应用到你的集群中。安装完成后,Helm 会输出一些有用的信息,通常来自 Chart 中的 NOTES.txt
文件,可能包含如何访问应用、获取密码等说明。
常用安装选项:
- 指定 Namespace: 推荐为每个应用或环境使用独立的 Namespace。
bash
# 安装到 'webapps' namespace,如果 namespace 不存在则自动创建
helm install my-nginx bitnami/nginx --namespace webapps --create-namespace - 覆盖默认配置 (使用 –set): 可以在命令行中直接覆盖
values.yaml
中的个别参数。
bash
# 将 Service 类型改为 LoadBalancer,并将副本数设为 3
helm install my-nginx bitnami/nginx --namespace webapps --create-namespace \
--set service.type=LoadBalancer \
--set replicaCount=3 - 覆盖默认配置 (使用 -f 或 –values): 对于复杂的配置,最好创建一个自定义的 Values 文件(例如
my-values.yaml
),然后在安装时指定它。
yaml
# my-values.yaml
replicaCount: 2
service:
type: ClusterIP
image:
tag: "1.23.0-debian-11-r0" # 指定特定的镜像版本
bash
helm install my-nginx bitnami/nginx --namespace webapps --create-namespace -f my-values.yaml
如果同时使用--set
和-f
,--set
中的值优先级更高。
6. 查看已部署的 Release:
使用 helm list
(或 helm ls
) 命令查看当前 Namespace 或所有 Namespace 中的 Release。
“`bash
查看当前 namespace 的 releases
helm list
查看指定 namespace 的 releases
helm list –namespace webapps
查看所有 namespace 的 releases
helm list –all-namespaces
“`
输出会包含 Release 名称、Namespace、版本号 (Revision)、状态 (deployed, failed 等)、Chart 名称和版本、以及应用版本。
7. 查看 Release 状态和资源:
-
获取 Release 的详细状态:
bash
helm status my-nginx --namespace webapps
这将显示 Release 的基本信息、上次部署时间、NOTES 内容以及此 Release 管理的 Kubernetes 资源列表及其状态。 -
查看 Release 的历史版本:
bash
helm history my-nginx --namespace webapps
每次升级或回滚都会产生一个新的 Revision。这个命令可以让你看到历史操作记录。
8. 升级 Release:
当需要更新应用配置(例如,更改镜像版本、调整资源限制)或者 Chart 本身有新版本时,使用 helm upgrade
命令。
“`bash
升级 my-nginx,使用新的配置文件 my-new-values.yaml
helm upgrade my-nginx bitnami/nginx –namespace webapps -f my-new-values.yaml
升级 my-nginx 到 Chart 的特定版本,并设置一个新值
helm upgrade my-nginx bitnami/nginx –namespace webapps –version 13.2.1 –set persistence.enabled=true
–atomic 标志:如果升级失败,自动回滚到之前的版本
helm upgrade my-nginx bitnami/nginx –namespace webapps -f my-values.yaml –atomic
“`
升级操作会生成一个新的 Release Revision。Helm 会计算当前状态与目标状态之间的差异,并只应用必要的更改。
9. 回滚 Release:
如果升级后出现问题,可以轻松回滚到之前的某个稳定版本 (Revision)。
“`bash
首先查看历史版本
helm history my-nginx –namespace webapps
假设 Revision 1 是稳定版本,当前是 Revision 2 (失败的升级)
回滚到 Revision 1
helm rollback my-nginx 1 –namespace webapps
“`
回滚操作本身也会创建一个新的 Revision,标记这次回滚动作。
10. 卸载 Release:
当不再需要某个应用时,使用 helm uninstall
命令将其从集群中彻底删除。
bash
helm uninstall my-nginx --namespace webapps
这会删除与该 Release 相关的所有 Kubernetes 资源(除非资源被特别注解为保留)。
五、 Chart 结构详解
了解一个标准 Helm Chart 的目录结构有助于理解其工作原理和进行自定义开发:
mychart/
├── Chart.yaml # 包含 Chart 的元数据 (名称, 版本, 描述等)
├── values.yaml # Chart 的默认配置文件
├── charts/ # 存放依赖的子 Chart (tgz 压缩包)
├── templates/ # 存放 Kubernetes 资源模板文件
│ ├── NOTES.txt # 安装/升级后显示的帮助信息 (Go template)
│ ├── deployment.yaml # Deployment 模板
│ ├── service.yaml # Service 模板
│ ├── ingress.yaml # Ingress 模板 (如果需要)
│ ├── configmap.yaml # ConfigMap 模板 (如果需要)
│ ├── secrets.yaml # Secret 模板 (通常用于存放占位符或由 Helm 生成)
│ └── _helpers.tpl # Go template 助手函数/模板片段定义
└── .helmignore # 指定打包 Chart 时忽略的文件/目录
Chart.yaml
: 定义 Chart 的基本信息,如apiVersion
(Helm Chart API 版本),name
,version
(Chart 版本),appVersion
(应用版本),description
等。还可以在这里声明依赖 (dependencies
)。values.yaml
: 提供 Chart 模板中变量的默认值。用户可以通过-f
或--set
覆盖这些值。良好的values.yaml
设计应包含清晰的注释,解释每个参数的作用。templates/
: 存放所有 Kubernetes 资源定义的模板文件。这些文件使用 Go 模板语言编写。Helm 会渲染这个目录下的所有.yaml
或.tpl
文件。templates/NOTES.txt
: 特殊的模板文件,其内容会在helm install
或helm upgrade
成功后打印到控制台,用于向用户提供后续操作指引。templates/_helpers.tpl
: 用于定义可复用的模板片段(称为 “named templates”)或助手函数。这有助于保持模板文件的简洁和 DRY (Don’t Repeat Yourself)。通常使用{{ include "mychart.fullname" . }}
这样的语法来调用。charts/
: 如果你的 Chart 依赖于其他的 Chart(例如,一个 Web 应用 Chart 依赖一个数据库 Chart),可以将依赖的 Chart 包(.tgz
文件)放在这里,或者在Chart.yaml
中声明依赖,然后使用helm dependency update
下载它们。
六、 Chart 模板基础
Helm 模板的核心是 Go 模板语言,结合了一些 Helm 特有的函数和对象。
- 变量: 主要通过
.Values
对象访问values.yaml
中定义的值。例如,{{ .Values.replicaCount }}
会获取replicaCount
的值。 - 内置对象: Helm 提供了几个有用的内置对象:
.Release
: 包含 Release 的信息,如.Release.Name
,.Release.Namespace
,.Release.IsInstall
,.Release.IsUpgrade
。.Chart
: 包含 Chart 的信息,如.Chart.Name
,.Chart.Version
。.Files
: 允许访问 Chart 中的非模板文件。.Capabilities
: 提供关于 Kubernetes 集群能力的信息,如.Capabilities.KubeVersion.Version
。
- 函数与管道: Helm 提供了丰富的内置函数(如
quote
,upper
,default
,required
)以及 Sprig 库中的函数。可以使用管道符|
将一个函数的输出传递给下一个函数,例如{{ .Values.message | quote }}
。 -
控制结构: 支持
if/else
,with
,range
等控制流语句,用于条件渲染或遍历列表/字典。
“`yaml
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ include “mychart.fullname” . }}
spec:
# … Ingress spec based on .Values.ingress …
{{- end }}{{- range .Values.extraVolumes }}
– name: {{ .name }}
{{- if .isConfigMap }}
configMap:
name: {{ .configMapName }}
{{- else }}
secret:
secretName: {{ .secretName }}
{{- end }}
{{- end }}
* **命名模板 (Named Templates)**: 在 `_helpers.tpl` 中使用 `{{ define "mychart.fullname" }}` 定义,然后在其他模板中使用 `{{ include "mychart.fullname" . }}` 调用。这对于生成资源名称、标签等常用逻辑非常有用。
bash
* **调试模板**: 使用 `helm template` 命令可以在不实际部署的情况下渲染 Chart 模板,并查看生成的 Kubernetes YAML。这对于调试模板错误非常方便。渲染本地 Chart ‘mychart’ 的模板
helm template my-release ./mychart -f my-values.yaml –namespace test
也可以渲染远程 Chart
helm template my-release bitnami/nginx –version 13.2.1
“`
七、 创建自己的 Chart
当你需要部署自研应用或对现有 Chart 做大量定制时,就需要创建自己的 Chart。
1. 使用 helm create
命令:
这是最快的方式,Helm 会为你生成一个包含基本结构和示例文件的 Chart 骨架。
bash
helm create myapp
这会创建一个名为 myapp
的目录,里面包含了我们在 Chart 结构部分介绍的所有基本文件和目录,以及一些示例模板(一个简单的 Nginx Deployment 和 Service)。
2. 修改 Chart:
- 编辑
Chart.yaml
,更新描述、版本等信息。 - 编辑
values.yaml
,定义你的应用所需的配置参数,删除或修改默认生成的示例参数。 - 修改
templates/
目录下的模板文件,使其符合你的应用需求。例如,更改 Deployment 中的镜像名称 (image.repository
,image.tag
),调整端口、环境变量、挂载卷等。 - 如果需要,添加新的模板文件(如 ConfigMap, Secret, Ingress 等)。
- 更新
templates/NOTES.txt
,提供安装后的使用说明。
3. Linting 和测试:
- 使用
helm lint ./myapp
检查 Chart 的语法和最佳实践符合性。 - 使用
helm template ./myapp -f values.yaml
(或自定义 values 文件) 来预览生成的 YAML。 - 使用
helm install myapp-test ./myapp --dry-run --debug
模拟安装过程,检查是否有错误。--dry-run
表示只模拟,不实际部署。
4. 安装本地 Chart:
确认 Chart 无误后,可以像安装远程 Chart 一样安装本地 Chart:
bash
helm install my-first-app ./myapp --namespace dev -f my-custom-values.yaml
八、 依赖管理
如果你的应用依赖其他服务(例如,一个 WordPress 应用依赖 MySQL 数据库),可以在 Chart.yaml
中声明这些依赖:
“`yaml
myapp/Chart.yaml
apiVersion: v2
name: myapp
version: 0.1.0
appVersion: “1.0”
description: My awesome web application.
dependencies:
– name: mariadb # 依赖的 Chart 名称
version: “11.x.x” # 依赖 Chart 的版本范围
repository: “https://charts.bitnami.com/bitnami” # 依赖 Chart 所在的仓库 URL
condition: mariadb.enabled # 可选:只有当 values.yaml 中 mariadb.enabled 为 true 时才安装此依赖
# alias: my-database # 可选:为子 Chart 指定一个别名,在 values 中可以通过别名配置
“`
声明依赖后,需要运行以下命令来下载或更新依赖项到 charts/
目录下:
“`bash
helm dependency update ./myapp
或者 helm dependency build ./myapp (效果类似,通常 update 更常用)
“`
在安装 myapp
时,Helm 会先安装其依赖项 (MariaDB)。你可以在 myapp
的 values.yaml
文件中,通过依赖 Chart 的名称(或别名)来配置子 Chart 的参数:
“`yaml
myapp/values.yaml
replicaCount: 1
image:
repository: myapp-image
tag: latest
配置依赖的 mariadb chart
mariadb:
enabled: true # 触发 condition
auth:
rootPassword: “mysecretrootpassword”
database: “myappdb”
username: “myappuser”
password: “myappuserpassword”
primary:
persistence:
enabled: true
size: 8Gi
“`
九、 总结与后续步骤
Helm 作为 Kubernetes 的包管理器,通过 Chart 的概念极大地简化了 Kubernetes 应用的部署、管理和共享。掌握 Helm 的基本操作(安装、搜索、安装、升级、回滚、卸载)以及 Chart 的结构和模板机制,是高效使用 Kubernetes 的关键一步。
本文涵盖了:
- Helm 的必要性和核心价值。
- Helm v3 的架构和关键概念。
- 多种 Helm 客户端安装方法。
- 完整的 Helm 基本工作流程演示。
- Chart 的目录结构和文件作用详解。
- Chart 模板的基础语法和常用对象。
- 创建自定义 Chart 的基本步骤。
- 使用 Helm 管理 Chart 依赖。
接下来你可以探索:
- 更高级的模板技术: 深入学习 Go 模板语言、Helm 内置函数、条件逻辑、循环、命名模板等。
- Helm 插件 (Plugins): 扩展 Helm 功能,例如
helm-diff
(预览升级变更)、helm-secrets
(管理加密的 secrets)。 - Chart 测试 (Test Hooks): 在 Chart 中定义测试 Pod,验证部署是否成功。
- Chart 仓库管理: 搭建私有的 Chart 仓库 (如 ChartMuseum, Harbor)。
- 持续集成/持续部署 (CI/CD): 将 Helm 集成到你的 CI/CD 流水线中,实现自动化部署。
- 探索 Artifact Hub (https://artifacthub.io/): 发现和使用社区共享的大量 Helm Charts。
通过不断实践和探索,Helm 将成为你驾驭复杂 Kubernetes 环境的得力助手。希望这篇文章能为你开启 Helm 的学习之旅提供坚实的基础。