在Kubernetes(K8s)生态中,Helm被誉为“K8s的包管理器”,其核心作用是简化K8s应用的部署、升级、回滚和卸载流程。对于运维人员和开发者而言,掌握Helm的基础操作,能大幅提升K8s应用管理的效率,避免手动编写、维护大量YAML配置文件的繁琐工作。本文将从Helm的核心概念入手,逐步讲解其基础操作,覆盖仓库管理、应用安装、配置自定义、升级卸载等核心场景,适合Helm新手快速入门。
一、Helm核心概念介绍
在学习操作前,需先明确Helm的三个核心概念,理解它们之间的关系,才能更好地掌握后续操作逻辑:
1. Chart(图表)
Chart是Helm的“应用包”,本质上是一个包含K8s应用所有资源配置文件的目录集合。它封装了应用运行所需的Deployment、Service、ConfigMap等所有YAML配置,还包含了应用的版本信息、依赖关系、默认配置等。可以把Chart理解为“软件安装包”,比如MySQL、Nginx的Helm Chart,就相当于它们的K8s部署安装包。
2. Repository(仓库)
Repository(简称Repo)是Chart的“存储仓库”,用于集中存储和分发Chart包,类似Linux的YUM仓库、Docker的Docker Hub。Helm官方维护了一个公共仓库(Helm Stable Repository,现已迁移至Artifact Hub),同时也支持私有仓库(企业内部搭建,用于存储内部应用的Chart)。我们通过仓库地址,就能快速查找、下载所需的Chart包。
3. Release(发布)
Release是Chart在K8s集群中的“实例化部署”。当我们使用Helm安装一个Chart时,Helm会根据Chart的配置,在K8s集群中创建对应的资源,并生成一个唯一的Release(可自定义名称)。一个Chart可以在同一个集群中部署多次,每次部署都会生成一个独立的Release,互不干扰(比如部署两个Nginx实例,可创建nginx-release-1和nginx-release-2两个Release)。
补充:Values.yaml
Values.yaml是Chart中用于存储“默认配置”的文件,包含了应用部署时的可配置参数(比如容器镜像版本、端口号、资源限制、存储大小等)。用户可以通过修改这些参数,自定义应用的部署配置,无需直接修改Chart内部的核心YAML文件,实现“配置与模板分离”,这也是Helm灵活易用的核心原因之一。
二、Helm环境准备(前置条件)
在执行后续操作前,需确保已完成以下环境准备:
-
已安装Kubernetes集群(单节点或多节点均可,版本建议1.19+),且能通过kubectl正常访问集群。
-
已安装Helm客户端(版本建议3.x+,Helm 3移除了Tiller组件,部署更简单,是目前的主流版本)。
Helm客户端安装验证:执行helm version命令,若能显示客户端版本(无需服务端版本,Helm 3无Tiller),则说明安装成功。
三、Helm基础操作实战
以下操作均基于Helm 3.x版本,所有命令均在Helm客户端执行,且确保kubectl已配置好集群访问权限(~/.kube/config文件正常)。
1. 仓库管理:添加、查看、更新、删除仓库
仓库是获取Chart的核心渠道,我们首先学习如何管理Helm仓库,重点掌握“添加仓库”(最常用)和“更新仓库”(确保获取最新Chart)。
(1)添加公共仓库
Helm官方推荐使用Artifact Hub上的仓库,这里以添加“Bitnami仓库”(包含大量常用应用的Chart,如Nginx、MySQL、Redis等)为例:
helm repo add bitnami https://charts.bitnami.com/bitnami
命令说明:
-
repo add:添加仓库的核心命令。
-
bitnami:仓库的“别名”(自定义,后续操作可通过别名引用仓库,无需输入完整仓库地址)。
-
https://charts.bitnami.com/bitnami:仓库的实际地址(可从Artifact Hub查询对应仓库的地址)。
若需添加其他公共仓库,可参考Artifact Hub(https://artifacthub.io/)的指引,比如添加Helm官方仓库:
helm repo add helm-official https://charts.helm.sh/stable
(2)查看已添加的仓库
执行以下命令,查看当前Helm客户端已添加的所有仓库:
helm repo list
输出结果会包含仓库别名、仓库地址、是否启用等信息,确认仓库添加成功。
(3)更新仓库(同步最新Chart信息)
添加仓库后,仓库中的Chart可能会更新版本,执行以下命令更新所有仓库的Chart信息(确保能获取到最新的Chart版本):
helm repo update
若只需更新某个特定仓库(如bitnami),可执行:helm repo update bitnami
(4)删除仓库(可选)
若无需使用某个仓库,可执行以下命令删除:
helm repo remove 仓库别名
示例:删除bitnami仓库:helm repo remove bitnami
2. 应用安装:使用默认Values安装Chart
仓库添加完成后,就可以通过Helm安装Chart,生成Release。首先学习最基础的安装方式:使用Chart的默认Values配置(即不修改任何参数,直接使用Values.yaml中的默认值)。
以安装Nginx为例(使用bitnami仓库的nginx Chart):
步骤1:搜索仓库中的Chart(可选,确认Chart存在)
执行以下命令,搜索bitnami仓库中名为nginx的Chart:
helm search repo bitnami/nginx
输出结果会包含Chart的名称、版本、描述等信息,确认Chart可获取。
步骤2:使用默认Values安装Chart
helm install nginx-release bitnami/nginx
命令说明:
-
install:安装Chart的核心命令。
-
nginx-release:自定义的Release名称(必须唯一,同一集群中不能重复),可自行修改(如nginx-test、my-nginx等)。
-
bitnami/nginx:指定要安装的Chart,格式为“仓库别名/Chart名称”。
补充:指定namespace安装(实战常用)
默认情况下,Helm会将Release安装到K8s的default命名空间。若需将应用安装到指定namespace(如nginx-namespace),需先创建namespace(若未存在),再执行安装命令,添加--namespace(缩写-n)参数指定命名空间:
# 1. 创建指定namespace(若已存在,可跳过此步骤)
kubectl create namespace nginx-namespace
# 2. 指定namespace安装Chart
helm install nginx-release bitnami/nginx -n nginx-namespace
说明:
- 命名空间需提前创建,否则会报错“Error: target namespace does not exist”;
- 后续操作该Release(如升级、卸载、查看)时,需同步添加
-n 命名空间参数,否则会默认去default命名空间查找,导致找不到Release; - 示例:查看nginx-namespace下的Release,需执行
helm list -n nginx-namespace。
步骤3:验证安装结果
安装完成后,执行以下命令,查看已部署的Release:
helm list
若Release的STATUS为“deployed”,说明安装成功。
同时,可通过kubectl查看K8s集群中生成的资源(如Pod、Service):
kubectl get pods
kubectl get svc
会看到名称包含“nginx-release”的Pod和Service,说明应用已正常部署。
3. 配置自定义:替换Values的值(两种常用方式)
实际部署中,默认Values配置往往无法满足需求(如修改Nginx的端口、调整容器资源限制、修改镜像版本等)。Helm提供了两种常用方式替换Values的值,灵活自定义部署配置。
方式1:命令行直接指定(适合修改少量参数)
使用--set参数,在安装/升级时直接指定参数值,格式为:--set key=value,多个参数用逗号分隔。
示例:安装Nginx时,修改Nginx的服务端口为8080,同时调整容器的CPU限制为100m:
helm install nginx-custom bitnami/nginx --set service.port=8080,resources.limits.cpu=100m
说明:key的名称需与Values.yaml中的参数名称一致(可通过helm show values 仓库别名/Chart名称查看所有可配置参数)。
方式2:使用自定义Values文件(适合修改大量参数)
当需要修改多个参数时,命令行--set会显得繁琐且不易维护,此时可创建自定义的Values文件(如my-values.yaml),在文件中配置所需参数,再通过-f参数指定该文件,替换默认Values。
步骤1:创建自定义Values文件(my-values.yaml)
# my-values.yaml
# 自定义Nginx配置
service:
port: 8080 # 修改服务端口为8080
resources:
limits:
cpu: 100m # CPU限制
memory: 256Mi # 内存限制
requests:
cpu: 50m
memory: 128Mi
image:
tag: 1.23.1 # 修改Nginx镜像版本
步骤2:使用自定义Values文件安装Chart
helm install nginx-custom-file bitnami/nginx -f my-values.yaml
命令说明:-f my-values.yaml:指定自定义的Values文件,Helm会用该文件中的参数,覆盖默认Values.yaml中的对应参数(未修改的参数,仍使用默认值)。
4. 配置管理:将Values导出到本地管理
对于Chart的默认Values配置,我们可能需要查看所有可配置参数,或者将默认Values导出到本地文件,方便后续维护、修改(比如后续安装、升级时,基于导出的文件进行自定义调整)。Helm提供helm show values命令,可快速查看并导出Chart的默认Values配置,该命令用于读取Chart本身的values.yaml文件内容,是查看Chart默认配置的核心命令。
(1)查看Release当前的Values配置
执行以下命令,查看指定Release的当前Values配置(以nginx-release为例):
helm show values bitnami/nginx
输出结果会显示该Chart(bitnami/nginx)的所有默认Values参数,可清晰查看应用部署的可配置项及默认值,便于后续自定义修改。需要注意的是,helm show values用于查看Chart本身的默认配置,而非已部署Release的实际生效配置,这是其与原helm get values的核心区别。
(2)将Values导出到本地文件
使用-o file(或--output file)参数,将Values导出到本地文件(如exported-values.yaml):
helm show values bitnami/nginx > exported-values.yaml
执行完成后,本地会生成exported-values.yaml文件,该文件包含了bitnami/nginx Chart的所有默认Values配置。后续可直接修改该文件,在安装或升级Release时复用,实现配置自定义。
补充:若需导出Chart的默认Values(未修改过的原始配置),可执行:helm show values bitnami/nginx > default-values.yaml
5. 应用升级:修改配置后升级Release
当我们需要修改已部署应用的配置(如调整资源限制、更新镜像版本),或者升级Chart的版本时,无需卸载Release,可通过helm upgrade命令,直接升级Release,实现配置更新或版本升级。
场景1:修改配置(基于已导出的Values文件升级)
假设已导出nginx-release的Values到exported-values.yaml,现在修改该文件中的参数(如将服务端口改为8081),然后执行升级命令:
helm upgrade nginx-release bitnami/nginx -f exported-values.yaml
命令说明:
-
upgrade:升级Release的核心命令。
-
nginx-release:需要升级的Release名称(必须是已存在的Release)。
-
bitnami/nginx:对应的Chart(若不升级Chart版本,可保持不变;若需升级Chart版本,需确保仓库已更新,且指定新版本)。
-
-f exported-values.yaml:指定修改后的Values文件,覆盖当前配置。
场景2:升级Chart版本(同时保留自定义配置)
若Chart发布了新版本(如Nginx Chart从12.0.0升级到12.1.0),可执行以下命令,升级Chart版本,同时复用本地的自定义Values文件:
# 先更新仓库,确保获取到最新Chart版本
helm repo update bitnami
# 升级Release,指定Chart新版本(可选,若不指定,会使用最新版本)
helm upgrade nginx-release bitnami/nginx --version 12.1.0 -f exported-values.yaml
升级验证
升级完成后,执行以下命令,查看升级后的Release状态和Values配置:
helm list # 查看STATUS是否为deployed
helm show values bitnami/nginx # 查看Chart默认配置,确认可配置项
6. 应用卸载:删除Release及对应资源
当应用不再需要时,可通过helm uninstall命令,删除Release,同时删除该Release在K8s集群中生成的所有资源(Pod、Service、Deployment等),清理环境。
示例:卸载nginx-release这个Release:
helm uninstall nginx-release
卸载验证
执行以下命令,确认Release已被删除:
helm list # 看不到nginx-release的记录
kubectl get pods # 看不到名称包含nginx-release的Pod
补充:若需“软删除”(保留Release历史记录,可后续回滚),可添加--keep-history参数:helm uninstall nginx-release --keep-history
7. 补充操作:查看Release历史及回滚(可选)
升级或卸载时,若出现配置错误,可通过Helm的历史记录,回滚到之前的版本(需保留历史记录,卸载时未加--keep-history则无法回滚)。
-
查看Release历史:
helm history nginx-release,输出结果包含每次升级/安装的版本号、状态、时间等。 -
回滚到指定版本:
helm rollback nginx-release 版本号(版本号从history中获取)。 -
回滚到上一个版本:
helm rollback nginx-release 0(0代表上一个版本)。
四、常见问题排查
-
安装/升级失败,提示“Error: release xxx failed: ...”:执行
helm describe release xxx,查看详细错误信息,多数是配置参数错误(如Values参数写错)或K8s集群资源不足。 -
搜索不到Chart:确认仓库已添加且已更新(
helm repo update),同时确认Chart名称拼写正确(区分大小写)。 -
卸载后资源未删除:手动执行
kubectl delete命令删除残留资源,或检查是否有其他Release依赖该资源。
五、总结
本文围绕Helm的核心概念和基础操作展开,涵盖了仓库管理(添加、更新)、应用安装(默认配置、自定义配置)、Values导出、应用升级、卸载等核心场景,这些操作是日常使用Helm的基础,也是后续学习Helm高级特性(如自定义Chart、私有仓库搭建)的前提。
Helm的核心价值在于“简化K8s应用管理”,通过Chart封装配置,通过Values实现自定义,通过Release管理实例,让运维和开发人员无需关注复杂的YAML配置,专注于应用本身。建议大家多动手实践,熟悉每个命令的用法,逐步掌握Helm的使用技巧。
