Helm 作为 Kubernetes 的包管理工具,提供了丰富的命令行操作。其中 helm show 和 helm get 是两个经常被混淆但功能完全不同的命令组。在实际使用中,我经常看到新手将这两个命令混为一谈,导致获取不到预期的信息。
这两个命令虽然都以"获取信息"为目的,但设计理念和使用场景有着本质区别。理解它们的差异,能帮助我们在日常工作中更高效地操作 Helm Chart。
helm show 命令用于查看 Chart 包中的静态内容。它操作的是 Chart 的原始文件,不会与 Kubernetes 集群产生任何交互。这个命令在以下场景特别有用:
常用的子命令包括:
bash复制helm show all [CHART] # 显示所有信息
helm show chart [CHART] # 显示Chart.yaml内容
helm show values [CHART] # 显示values.yaml内容
helm show readme [CHART] # 显示README文件
helm show crds [CHART] # 显示CRD定义
假设我们有一个名为 nginx-1.2.3.tgz 的 Chart 包,我们可以这样使用:
bash复制# 查看Chart的基本元数据
helm show chart nginx-1.2.3.tgz
# 查看默认的values配置
helm show values nginx-1.2.3.tgz
# 查看完整的README内容
helm show readme nginx-1.2.3.tgz
提示:
helm show命令可以直接对打包后的.tgz文件操作,也可以对解压后的目录操作。
helm show 命令的实现逻辑相对简单:
这个过程中不会连接 Kubernetes API Server,完全是在本地操作。
helm get 命令用于获取已安装 Release 的动态信息。它需要与 Kubernetes 集群交互,查询特定 Release 的当前状态和配置。
常用子命令包括:
bash复制helm get all [RELEASE_NAME] # 获取所有信息
helm get hooks [RELEASE_NAME] # 获取钩子信息
helm get manifest [RELEASE_NAME] # 获取渲染后的模板
helm get notes [RELEASE_NAME] # 获取Release的notes
helm get values [RELEASE_NAME] # 获取用户自定义的values
假设我们有一个名为 my-nginx 的已安装 Release:
bash复制# 查看Release的所有信息
helm get all my-nginx
# 查看实际部署的Kubernetes资源清单
helm get manifest my-nginx
# 查看用户覆盖的values配置
helm get values my-nginx
注意:
helm get命令需要有效的 kubeconfig 配置,且需要有对应命名空间的读取权限。
helm get 的工作流程更为复杂:
| 特性 | helm show | helm get |
|---|---|---|
| 操作对象 | Chart 包(未安装) | 已安装的 Release |
| 是否需要集群连接 | 否 | 是 |
| 数据来源 | Chart 文件 | Kubernetes Secret |
helm show 检查 Chart 内容helm get 验证 Release 状态以 values 为例:
helm show values:显示 Chart 中默认的 values.yamlhelm get values:显示用户实际覆盖的 values 配置在实际工作中,我经常组合使用这两个命令来验证配置:
bash复制# 比较默认values和实际使用的values
diff <(helm show values chart.tgz) <(helm get values release-name)
helm show 执行速度很快,适合在 CI/CD 流水线中使用helm get 需要集群交互,在大型集群中可能会有延迟问题1:helm get 返回空或报错
问题2:helm show 无法读取 Chart
不同 Helm 版本间这两个命令的行为可能有细微差异:
helm get 不再支持 --revision 参数helm show 增加了对 OCI 注册表的支持这是一个我常用的检查脚本,可以自动对比 Chart 和 Release 的差异:
bash复制#!/bin/bash
CHART=$1
RELEASE=$2
echo "=== Default Values ==="
helm show values $CHART
echo "=== Overridden Values ==="
helm get values $RELEASE
echo "=== Manifest Diff ==="
helm template $CHART > expected.yaml
helm get manifest $RELEASE > actual.yaml
diff -u expected.yaml actual.yaml
对于 JSON 格式的输出,可以结合 jq 进行高级处理:
bash复制# 提取所有自定义values的键
helm get values my-release -o json | jq 'keys[]'
# 检查特定value是否被覆盖
helm get values my-release -o json | jq 'has("image.tag")'
虽然 Helm 3 移除了 --revision 参数,但我们仍可以通过以下方式比较不同版本:
bash复制# 获取当前values
helm get values my-release > current.yaml
# 获取历史版本的values(通过回滚到临时版本)
helm rollback my-release 1 --dry-run | grep -A1000 "USER-SUPPLIED VALUES:" | tail -n +2 > revision1.yaml
# 比较差异
diff -u revision1.yaml current.yaml
根据我在生产环境的使用经验,总结以下几点建议:
开发阶段:
helm show 全面检查 Chart 内容helm show values 的输出,确保默认配置合理部署阶段:
helm get manifest 验证实际渲染结果helm get hooks 检查钩子执行情况运维阶段:
helm get values 记录配置变更helm get notes 查看 Release 的特殊说明调试阶段:
helm show 和 helm get 定位配置问题helm get manifest | kubectl get -f - 直接查询资源状态在实际工作中,我见过不少团队对这两个命令的误用:
误区1:认为 helm show values 和 helm get values 输出相同
误区2:在 CI/CD 中使用 helm get 检查未安装的 Chart
helm show 和 helm template误区3:忽略 helm get notes 的输出
误区4:认为 helm show 需要集群访问权限
helm show 是完全离线的本地操作这两个命令通常与其他 Helm 命令配合使用:
与 helm template 配合:
bash复制# 先查看values
helm show values chart.tgz
# 使用自定义values渲染模板
helm template release-name chart.tgz -f custom-values.yaml
与 helm upgrade 配合:
bash复制# 获取当前values
helm get values release-name > current.yaml
# 修改后升级
helm upgrade release-name chart.tgz -f current.yaml
与 helm lint 配合:
bash复制# 检查Chart质量
helm lint .
# 查看Chart内容
helm show all .
现象:部署的 Pod 使用了错误的镜像版本,但 values 文件中明明配置了正确的版本。
排查步骤:
helm get values 检查实际使用的配置--set image.tag=old 的覆盖helm show values 确认默认值是正确的现象:Chart 中定义的 ConfigMap 没有创建。
排查步骤:
helm show manifest 检查模板是否包含该 ConfigMaphelm get manifest 检查实际渲染结果helm get values 输出确认条件值现象:helm upgrade 失败,报错无法解析模板。
排查步骤:
helm show chart 检查 Chart 的 API 版本helm get manifest 检查当前运行的资源两个命令都支持多种输出格式:
bash复制# JSON格式输出
helm show values chart.tgz -o json
helm get values release-name -o json
# YAML格式输出(默认)
helm show values chart.tgz -o yaml
helm get values release-name -o yaml
# 表格格式(部分信息支持)
helm show chart chart.tgz -o table
对于自动化处理,我推荐使用 JSON 格式,便于用 jq 等工具解析:
bash复制# 提取image.repository的值
helm get values my-release -o json | jq -r '.image.repository'
敏感信息处理:
helm get values 可能包含密码等敏感信息权限控制:
helm get 需要集群读取权限输出存储:
helm get 的输出直接存入版本控制系统对于大型 Release,这些技巧可以提高效率:
限制输出范围:
bash复制# 只获取values,不获取manifest等
helm get values release-name
使用JSON输出:
缓存结果:
helm show 的结果并行处理:
bash复制# 并行获取多个信息
helm get values release-name &
helm get manifest release-name &
wait
Helm 主要版本升级时需要注意:
Helm 2 到 Helm 3:
helm get 的 --revision 参数被移除Helm 3 小版本更新:
helm show 增加了对 OCI 的支持helm get 的输出字段可能有调整建议在升级前测试关键命令的兼容性。
可以通过插件增强这两个命令的功能:
helm-diff:
bash复制# 比较Chart和Release的差异
helm diff upgrade release-name chart.tgz
helm-secrets:
bash复制# 安全地处理包含敏感信息的values
helm secrets show values chart.tgz
helm-mapkubeapis:
bash复制# 处理API弃用问题
helm get manifest release-name | helm-mapkubeapis
当命令行为不符合预期时:
--debug 标志获取详细日志helm version 检查客户端和服务器版本HELM_DEBUG=1 环境变量kubectl get secret -l owner=helm 查看原始存储数据在不同环境中使用时需注意:
Windows:
Shell差异:
字符编码:
与kubectl集成:
bash复制# 直接查询Release的资源
helm get manifest release-name | kubectl get -f -
与CI/CD集成:
bash复制# 在流水线中验证Chart
helm show values chart.tgz > values.yaml
helm template test chart.tgz -f values.yaml
与监控系统集成:
bash复制# 定期检查Release状态
helm get manifest release-name | grep "image:" | awk '{print $2}'
官方文档:
helm show --helphelm get --help调试技巧:
helm get manifest + kubectl explain高级模式:
jq 或 yq 处理输出diff 或 meld 进行可视化比较经过多年的 Helm 使用,我总结了以下几点经验:
明确目的:清楚自己是要检查 Chart 内容还是 Release 状态
组合使用:helm show + helm get 能解决大部分配置问题
版本意识:注意 Helm 版本差异对命令行为的影响
自动化处理:将常用检查模式脚本化,提高效率
安全第一:谨慎处理 helm get 输出中的敏感信息
在实际工作中,我创建了一个别名组合来快速检查 Release:
bash复制alias helm-check='f(){ helm get values $1; helm get manifest $1 | head -20; }; f'
这个简单的工具可以快速展示 Release 的关键信息,帮助我快速定位问题。