在Kubernetes生态中,Helm作为事实标准的包管理工具,其命令行接口提供了丰富的子命令集。其中helm show和helm get这对"孪生命令"经常让使用者产生困惑——它们看似都用于获取Chart信息,但在设计理念和使用场景上存在本质差异。就像医生问诊时的"视诊"与"触诊",一个专注静态观察,一个侧重动态探查。
实际工作中,我曾因为混淆这两个命令导致调试效率低下。直到某次生产环境排查时,才发现helm get能获取到helm show无法显示的运行时信息。本文将结合具体案例,拆解这两个命令的六大核心差异点。
helm show是纯粹的静态分析工具,仅处理本地或远程仓库中的Chart文件(.tgz或目录),不依赖Kubernetes集群状态。它的工作方式类似于阅读产品说明书,可以查看:
bash复制helm show values prometheus-community/prometheus
而helm get需要与已部署的Release交互,就像查看设备的运行日志。它要求:
bash复制helm get values my-prometheus -n monitoring
两者的信息维度对比:
| 维度 | helm show | helm get |
|---|---|---|
| 数据源 | Chart包原始内容 | 集群中Release的当前状态 |
| 集群依赖 | 不需要 | 必须连接集群 |
| 时效性 | Chart发布时的静态信息 | Release实时的动态信息 |
| 典型用途 | 预部署检查 | 部署后诊断 |
chart:显示Chart.yaml元数据
bash复制helm show chart bitnami/nginx
# 输出包括apiVersion、appVersion等关键字段
values:查看values.yaml默认配置
bash复制helm show values bitnami/nginx --version 13.2.33
# 特别提示:添加--version参数查看特定版本配置
readme:获取Chart的使用说明
bash复制helm show readme stable/mysql
# 经验:新版本Chart的readme通常比仓库文档更新更快
all:聚合输出所有信息
bash复制helm show all oci://registry-1.docker.io/bitnamicharts/nginx
# 注意:Helm 3.8+支持OCI仓库直接查询
values:获取用户自定义的values
bash复制helm get values my-release --revision 2
# 技巧:配合--revision查看历史版本配置
manifest:查看渲染后的K8s资源清单
bash复制helm get manifest my-release | grep -A 5 Deployment
# 实战:常用grep过滤特定资源类型
hooks:显示钩子资源
bash复制helm get hooks my-release --no-hooks
# 注意:--no-hooks可排除普通资源
notes:查看Release的说明注释
bash复制helm get notes my-release
# 输出通常包含访问方式等关键信息
all:完整输出所有信息
bash复制helm get all my-release > release-dump.yaml
# 建议:重定向到文件便于分析
使用helm show建立标准化检查流程:
bash复制helm show chart ./my-chart | grep -q '^apiVersion: v2' || echo "需要升级Chart"
bash复制diff <(helm show values bitnami/redis) custom-values.yaml
bash复制helm show chart stable/wordpress | yq eval '.dependencies' -
helm get在事故排查中的典型应用:
bash复制helm get values my-app > current-values.yaml
helm diff upgrade my-app ./chart -f current-values.yaml
bash复制helm get manifest my-app | kubectl neat -o yaml > cleaned.yaml
bash复制helm get hooks my-app | kubectl describe job/pre-install
场景:追踪values的历史变更
bash复制for rev in $(seq 1 $(helm history my-app | wc -l)); do
helm get values my-app --revision $rev > rev-$rev-values.yaml
done
陷阱:默认只保留10个版本历史(可通过HELM_MAX_HISTORY调整)
敏感信息处理
bash复制helm show values ./chart | grep -E 'password|token|key'
# 部署前必须检查敏感字段默认值
最小权限原则
bash复制kubectl create rolebinding helm-read \
--clusterrole=view \
--serviceaccount=default:default \
--namespace=my-ns
# 为CI/CD系统配置只读权限
大型Chart处理
bash复制helm show manifest my-app --max-size 1M
# 限制输出大小避免内存溢出
缓存利用
bash复制helm show values bitnami/nginx --cache
# 使用缓存加速重复查询
问题1:"Error: release: not found"
bash复制kubectl get secrets -l owner=helm -n <namespace>
helm list --all --all-namespaces | grep <release>
问题2:"Error: chart metadata (Chart.yaml) missing"
bash复制tar -xzf broken-chart.tgz && touch Chart.yaml
helm package . && helm show chart ./repaired-chart.tgz
详细日志模式
bash复制helm get manifest --debug my-app 2> debug.log
模拟渲染检查
bash复制helm template ./chart | kubectl apply --dry-run=server -f -
版本差异对比
bash复制diff <(helm get values my-app) <(helm show values ./chart)
ArgoCD场景:
yaml复制hooks:
- name: pre-sync-check
command: ["helm", "show", "values", "./chart"]
args: ["|", "yq", "eval", ".image.tag", "-"]
Jenkins管道示例:
groovy复制stage('Verify') {
sh '''
helm show chart ${CHART_PATH} > meta.yaml
grep -q 'version: ${VERSION}' meta.yaml
'''
}
helm get结果解析器helm show与helm get输出OCI仓库支持(v3.8+)
bash复制helm show chart oci://registry.example.com/charts/my-app
JSON输出格式
bash复制helm get values my-app -o json | jq '.image'
降级处理方案:
bash复制helm3 get manifest my-app > manifest.yaml
helm2 template ./chart -x templates/deployment.yaml
在Helm生态中,show与get的合理运用就像外科医生的双镜联合——前者是了解工具特性的"内窥镜",后者是观察运行状态的"腹腔镜"。掌握它们的差异点,能让你在K8s应用生命周期管理中实现精准操作。建议在日常工作中建立这样的习惯:部署前必用show做检查清单,运维时善用get做状态快照。