1. Helm show 与 Helm get 的基础定位差异
Helm作为Kubernetes的包管理工具,其命令行接口提供了多种操作Chart的方式。其中helm show和helm get这两个子命令经常被混淆使用,但它们的设计初衷和使用场景有着本质区别。
helm show的核心功能是展示Chart的静态内容,它直接读取Chart包(.tgz文件)或Chart目录中的文件内容,不需要与Kubernetes集群交互。这个命令主要用于:
- 快速查看Chart的元信息(values.yaml、README.md等)
- 在安装前检查Chart内容
- 提取Chart中的特定文件
而helm get则是获取已安装Release的动态信息,它必须连接Kubernetes集群并查询特定Release的状态。典型使用场景包括:
- 查看已部署Release的当前配置
- 获取Release的历史版本信息
- 检查Release生成的Kubernetes资源清单
关键区别:
helm show操作的是Chart文件本身,而helm get操作的是集群中已部署的Release实例。
2. 命令参数与输出格式深度解析
2.1 helm show 的子命令参数
helm show包含多个子命令,每个子命令对应不同的输出内容:
helm show all [CHART] # 显示Chart所有信息 helm show values [CHART] # 显示values.yaml内容 helm show chart [CHART] # 显示Chart.yaml内容 helm show readme [CHART] # 显示README.md内容 helm show crds [CHART] # 显示CRD定义这些命令都支持以下常用参数:
--version:指定Chart版本--repo:从指定仓库获取Chart--devel:显示开发版本(alpha/beta/rc)--output format:指定输出格式(json/yaml)
例如查看bitnami/nginx Chart的默认values:
helm show values bitnami/nginx --version 13.2.232.2 helm get 的子命令参数
helm get的子命令则聚焦于Release状态:
helm get all RELEASE_NAME # 获取Release所有信息 helm get values RELEASE_NAME # 获取当前部署的values helm get manifest RELEASE_NAME # 获取生成的K8s资源清单 helm get hooks RELEASE_NAME # 获取钩子资源 helm get notes RELEASE_NAME # 获取Release注释关键参数包括:
--revision:指定历史版本号--output:输出格式控制--namespace:指定命名空间
例如获取my-nginx Release的manifest:
helm get manifest my-nginx -n default3. 典型使用场景对比
3.1 开发阶段:helm show 的价值
在Chart开发阶段,helm show是必不可少的工具:
快速验证Chart内容
helm show all ./mychart # 本地Chart目录验证 helm show values mysql-8.0.31.tgz # 打包文件验证提取默认values用于定制
helm show values bitnami/redis > myvalues.yaml # 然后编辑myvalues.yaml进行定制检查README中的使用说明
helm show readme stable/jenkins | less
3.2 运维阶段:helm get 的价值
在Release部署后,helm get提供了运维视角:
故障排查时对比配置
helm get values my-app > current-values.yaml diff current-values.yaml expected-values.yaml回滚时检查历史版本
helm history my-app helm get manifest my-app --revision 2审计生成的K8s资源
helm get manifest my-db | grep Secret -A5
4. 底层实现机制差异
4.1 helm show 的工作原理
helm show的实现路径非常简单:
- 根据Chart引用(本地路径/仓库名)定位Chart文件
- 解压或直接读取Chart文件内容
- 按子命令要求提取特定文件内容
- 格式化输出到终端
整个过程不涉及Kubernetes API调用,完全在本地完成。
4.2 helm get 的工作原理
helm get的工作流程则复杂得多:
- 连接Kubernetes集群(使用kubeconfig)
- 通过Release名称查询Secrets或ConfigMaps(Helm 3存储后端)
- 从存储中重建Release对象
- 根据子命令类型组织返回数据
- 可能涉及多个K8s API调用获取关联资源
5. 高级使用技巧与常见问题
5.1 helm show 的实用技巧
结合jq处理JSON输出
helm show chart bitnami/nginx --output json | jq '.dependencies'批量检查多个Chart
for chart in charts/*; do helm show values $chart | grep -A3 "resources"; done验证远程Chart版本
helm show chart bitnami/nginx --version 13.2.23 | grep version
5.2 helm get 的常见问题处理
Release不存在错误
Error: release: not found解决方案:
- 确认命名空间是否正确(-n参数)
- 检查helm list输出
权限不足问题
Error: configmaps is forbidden需要确保kubeconfig有足够权限读取Release相关资源
输出内容截断使用重定向保存完整输出:
helm get manifest large-app > full-manifest.yaml
6. 性能考量与最佳实践
6.1 大型Chart的处理建议
对于包含大量文件的Chart:
helm show all可能输出内容过多,建议使用特定子命令- 可以结合grep过滤关键信息:
helm show all my-chart | grep -A10 "serviceAccount"
6.2 生产环境使用规范
避免频繁调用helm get大量查询可能给API Server带来压力,建议:
- 对稳定Release减少查询频率
- 必要时缓存查询结果
敏感信息处理
helm get manifest可能暴露Secret:helm get manifest my-app | grep -i secret确保输出不会记录到日志系统
版本控制整合将
helm show values输出纳入Git管理:helm show values my-chart > values/prod.yaml git add values/prod.yaml
7. 与其他Helm命令的协作模式
7.1 与helm template的配合
helm show和helm template都可用于检查Chart内容,但:
show直接展示原始文件template会渲染模板生成最终YAML
典型工作流:
helm show values my-chart > values.yaml vim values.yaml # 编辑配置 helm template my-chart -f values.yaml > output.yaml7.2 与helm upgrade的联动
升级前使用helm get检查当前状态:
helm get values my-app > current.yaml # 修改current.yaml helm upgrade my-app -f current.yaml升级后验证变更:
helm get manifest my-app --revision 3 | diff -u <(helm get manifest my-app --revision 2) -8. 安全注意事项
8.1 helm show 的安全边界
虽然helm show不连接集群,但仍需注意:
- 从可信源获取Chart(避免恶意Chart)
- 检查values.yaml中的敏感默认值
- 仓库证书验证(--verify参数)
8.2 helm get 的权限控制
helm get涉及集群访问,建议:
- 遵循最小权限原则
- 使用ServiceAccount而非个人凭证
- 敏感环境禁用
helm get manifest权限
RBAC示例:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: helm-reader rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "list"] - apiGroups: ["helm.cattle.io"] resources: ["releases"] verbs: ["get"]