Helm 是 Kubernetes 生态中最流行的包管理工具,被称为“K8s 的 apt/yum”。它通过 Chart(图表)这一标准化打包格式,将一组相关的 Kubernetes 资源(Deployment、Service、ConfigMap 等)封装、版本化并一键部署。对平台工程和 DevOps 团队来说,Helm 解决了三个核心问题:应用定义难以复用、多环境参数无法隔离、发布过程不可回滚。它由 Deis 团队创建,2018 年捐赠给 CNCF,目前是毕业级项目,被 AWS、Google Cloud、Azure 等主流云厂商的 marketplace 作为应用分发标准。 本篇攻略完整覆盖 Helm 从入门到生产的全路径:先看工具速览卡了解全貌,然后按步骤完成安装与第一个 Chart 部署,深入模板语法与生命周期钩子等核心能力,再讨论大规模集群中的生产部署与避坑清单,最后通过对比表、典型场景、常见误区和面试题强化理解。无论你是刚接触 K8s 的应用开发者,还是负责多集群发布的平台工程师,都能从中获得可立即落地的操作指引。

岗位关联

掌握 Helm 是 K8s 工程师的必备技能:它不仅是应用交付的事实标准,更是理解云原生“声明式 + 可版本化”基础设施哲学的钥匙,直接关系到你在 CI/CD、平台工程岗位的竞争力。

目录
  1. 为什么需要 Helm:从 YAML 复制粘贴到标准化应用交付
  2. 安装与环境配置:3 步就绪
  3. 快速上手:5 分钟部署第一个应用
  4. 核心能力详解:4 大支柱
  5. 生产部署与监控:从上线到运维
  6. 版本迭代
  7. AI 应用场景
  8. 常见误区
  9. 面试题
工具类型
Kubernetes 包管理工具(CNCF 毕业项目)
开发商
CNCF(Cloud Native Computing Foundation)维护
开源协议
Apache 2.0(可商用)
GitHub Stars
无
主要语言
Go
当前版本
v3.16.x(2024 年 11 月)
安装方式
脚本安装 / 包管理器 / 二进制下载
官方文档
上手难度
★★★☆☆(中等)
适合人群
K8s 工程师、DevOps、平台工程团队
同类工具
Kustomize、Jsonnet、Helmfile
托管服务
无

速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。

为什么需要 Helm:从 YAML 复制粘贴到标准化应用交付

裸写 kubectl 管理 K8s 应用的痛点非常直接:一个稍复杂的应用往往需要 5-10 个 YAML 文件(Deployment、Service、Ingress、ConfigMap、Secret……),这些文件之间存在隐式关联,但没有任何机制保证它们作为一个整体被创建、升级和回滚。更麻烦的是环境差异——开发、预发、生产环境的副本数、镜像 tag、资源配置都不同,传统的做法是复制出多份 YAML 再逐个修改,维护成本随环境数量线性增长。

Helm 的解决方案是把一组 K8s 资源打包成 Chart,通过模板引擎(基于 Go template 和 Sprig 函数库)将可变参数抽离到 values.yaml 中。部署时只需提供一个 values 文件(或 --set 参数),Helm 就会渲染出完整的 YAML 并调用 K8s API 创建资源。Release(发布实例)机制记录每次部署的状态和版本历史,一条 helm rollback 命令即可回到任意历史版本。

与 Kustomize 这类“纯渲染工具”相比,Helm 的核心差异在于引入了 Release 状态管理和 Chart 仓库的概念。Kustomize 只负责“生成 YAML”,Helm 则额外跟踪“这些 YAML 部署后处于什么状态”。让 Helm 在需要版本回滚、依赖管理(Chart 可以依赖子 Chart)和发布分发的场景中明显更完整。

安装与环境配置:3 步就绪

安装 Helm 的推荐方式是通过官方脚本,也可以使用各操作系统的包管理器,或直接从 GitHub Releases 下载二进制。脚本安装最通用,适用于 Linux 和 macOS。

验证安装后,需要确认 Helm 能访问你的 Kubernetes 集群。Helm 通过 kubeconfig 文件与集群通信,默认读取 ~/.kube/config。执行 helm list 如果不报错且能返回结果(首次使用时可能为空列表),说明连接正常。若使用 minikube 或 kind 等本地集群,需先启动集群再执行上述命令。

bash11 行
# 步骤一:脚本安装(Linux/macOS)curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3chmod 700 get_helm.sh./get_helm.sh # 步骤二:验证安装(应输出 v3.x.x)helm version # 步骤三:配置 Chart 仓库(添加官方稳定仓库)helm repo add bitnami https://charts.bitnami.com/bitnamihelm repo update

快速上手:5 分钟部署第一个应用

最小可用流程的核心理路是:先找一个现成的 Chart 部署到集群验证链路,再逐步理解 Chart 的内部结构。以部署一个 Nginx 为例,走完搜索、安装、查看、卸载的完整闭环。

1. 搜索可用的 Chart:在终端执行 helm search repo nginx,输出中会列出 Bitnami 仓库中的 nginx 相关 Chart,注意查看 CHART VERSION 和 APP VERSION 两列的区别——前者是 Chart 打包版本,后者是被部署应用的版本。

2. 安装 Chart:执行 helm install my-nginx bitnami/nginx。命令格式为 helm install <release名称> <chart>。执行成功后 Helm 会输出 NOTES.txt 中的使用说明(这是 Chart 作者预写的部署后提示)。

3. 查看 Release 状态:执行 helm list 查看已部署的 Release,默认显示在 default 命名空间。用 helm status my-nginx 查看详细状态。

4. 自定义部署参数:执行 helm install my-nginx-2 bitnami/nginx --set replicaCount=3 --namespace dev --create-namespace,用 --set 覆盖默认参数。

5. 回滚与卸载:升级后如需回退,先 helm upgrade my-nginx bitnami/nginx --set replicaCount=5,再 helm rollback my-nginx 1 回滚到第 1 个版本;最后 helm uninstall my-nginx 清理。

完成上述操作后,你就经历了 Helm 最核心的“安装 → 查看 → 升级 → 回滚 → 卸载”完整生命周期。进阶技巧:将自定义参数写入 my-values.yaml 文件,然后用 -f my-values.yaml 替代多个 --set,便于参数复用和版本化管理。

核心能力详解:4 大支柱

支柱一·Chart 打包与分发。 Chart 是 Helm 的应用打包格式,本质是一个遵循特定目录结构的文件夹:Chart.yaml 声明元数据(名称、版本、依赖),values.yaml 提供默认配置,templates/ 存放 Go template 模板文件。使用 helm package mychart/ 可将目录打包为 .tgz 归档,通过 helm push 或 helm repo index 发布到 Chart 仓库。依赖管理通过 Chart.yaml 中的 dependencies 字段声明,子 Chart 会被自动拉取并合并渲染。

支柱二·Go Template 模板引擎。 Helm 模板基于 Go text/template,并扩展了 Sprig 函数库(提供 100+ 字符串、数学、编码等辅助函数)。模板语法分为三类:{{ .Values.replicaCount }} 是取值表达式,{{ if .Values.service.enabled }}...{{ end }} 是条件逻辑,{{ range .Values.containers }}...{{ end }} 是循环遍历。模板还内置了 include(模板片段复用)、default(默认值兜底)、required(必填校验)等常用函数。这是 Helm 最核心、学习曲线最陡的部分——掌握模板语法后,可以写出适配任意环境的通用 Chart。

支柱三·Release 生命周期管理。 这是 Helm 区别于纯渲染工具的关键能力。每次 helm install、helm upgrade 都会生成一个新的 Release 版本并记录到集群中(Secret 对象里),helm history <release> 可以查看所有版本的变更时间、状态和说明。helm rollback <release> <版本号> 可回退到任意历史版本,实现秒级回滚。Helm v3 还支持 helm upgrade --install 组合命令——如果 Release 不存在则安装,存在则升级,非常适合 CI/CD 流水线使用。

支柱四·Hooks 与生命周期钩子。 Helm 允许在 Release 生命周期的特定节点执行额外操作,通过在模板中给资源添加 "helm.sh/hook" 注解实现。支持的钩子包括 pre-install、post-install、pre-upgrade、post-upgrade、pre-delete、post-delete 等。典型场景:数据库迁移任务(Job)在 pre-upgrade 阶段执行、部署通知在 post-install 阶段发送。钩子资源有独立的删除策略(hook-delete-policy),默认在钩子执行完成后保留,需要显式配置才能在成功后自动删除。

生产部署与监控:从上线到运维

部署方式一:CI/CD 流水线集成。 生产环境中最常见的模式是在 CI 流水线中执行 helm upgrade --install。推荐做法:在流水线的构建阶段生成镜像并推送,然后在部署阶段使用 helm upgrade --install <release> <chart路径> --namespace <环境名> --values <环境专属values文件> --set image.tag=$CI_COMMIT_SHORT_SHA --atomic --timeout 5m。--atomic 参数确保升级失败时自动回滚,避免出现“升级到一半”的中间状态。多环境管理建议维护 values-dev.yaml、values-staging.yaml、values-prod.yaml 三套文件,通过流水线参数选择。

部署方式二:大规模多集群管理。 当集群数量增长到两位数后,直接在每个集群手动执行 helm 命令不可行。推荐引入 GitOps 工具(Argo CD 或 Flux CD)管理 Helm Release:将 values 文件和 Chart 版本声明存放在 Git 仓库,由 GitOps 工具自动同步到集群。此方案的优势是审计追溯(所有变更都通过 Git commit)和自动漂移纠正(集群状态偏离声明时自动恢复)。Helm 也支持 OCI 仓库(helm pull oci://registry-1.docker.io/bitnamicharts/nginx),将 Chart 与镜像存放在同一仓库便于权限统一管理。

可观测性。 Helm 本身的监控分两个层面:一是 Release 状态监控——通过 helm list --all-namespaces --failed 定期筛查失败的 Release,或使用 Prometheus 的自定义 exporter 采集 Release 状态指标;二是模板渲染结果审计——生产环境建议开启 helm lint 和 helm template 的 CI 检查,前者校验 Chart 规范,后者在部署前渲染出完整 YAML 供人工 review。注意,helm template 只输出渲染结果但不与集群交互,是安全的预检手段。

<p class="para-label">避坑清单:</p>

<ul class=“dash-list“><li>坑 1:Chart 与 App 版本混淆——CHART VERSION 是 Chart 自身的打包版本,APP VERSION 是被部署应用的版本。升级 Chart 不必然升级应用,排查问题时先确认你改的是哪个版本。</li><li>坑 2:values 覆盖链失效——values 的优先级从低到高是:Chart 内置 values.yaml → 父 Chart 的 values.yaml → -f 指定的文件 → --set 参数,后者覆盖前者。多环境管理时如果发现参数没生效,检查是否有更高优先级的来源覆盖了它。</li><li>坑 3:模板缩进错误——Go template 的 {{- 和 -}} 用于去除空白,但对 YAML 缩进的处理需要特别小心。嵌套 range 或 if 时容易渲染出非法 YAML,部署时报”unexpected end of stream“错误。建议用 helm template --debug 查看渲染结果排查。</li><li>坑 4:升级未指定 --atomic 导致状态悬置——升级过程中如果 Pod 一直无法就绪,默认情况下升级会”卡住”而不是回滚,Release 处于 pending-upgrade 状态,后续操作全部被锁。生产环境务必加 --atomic,并配合 --timeout 设置合理的超时时间。</li><li>坑 5:Secret 资源不回滚——Helm v3 的 rollback 会恢复大多数资源,但 Secret 的恢复依赖 K8s Secret 的 immutable 字段设置。若 Secret 被应用缓存后修改,回滚可能不会触发应用重新加载,需要手动重启应用 Pod。</li></ul>

维度HelmKustomizeJsonnetHelmfile
定位K8s 包管理 + 模板化部署K8s 原生配置管理(纯渲染)通用 JSON 配置语言Helm 的多 Release 编排层
编排范式模板 + values 参数覆盖基准 + 补丁(overlay)数据驱动的函数式编程声明式统一定义 + Helm 驱动
类型约束Go template + Sprig 函数YAML 补丁合并强类型、可定义函数依赖 Helm 语法
学习曲线★★★☆☆★★☆☆☆★★★★★★★★★☆
生态集成Chart 仓库 + OCI + Artifact Hubkubectl 内置(1.14+)需自行构建渲染工具链依托 Helm 生态
生产部署Release 管理 + 回滚 + hooks需自建 CI + GitOps需自建渲染与发布流程大型多环境编排管理
LicenseApache 2.0Apache 2.0Apache 2.0Apache 2.0
适合谁绝大多数 K8s 团队无复杂逻辑的场景配置逻辑复杂的平台团队管理几十上百个 Release 的团队

选型建议:最广泛的选择是 Helm——生态最完整,从公有云 marketplace 到开源项目都默认提供 Chart。Kustomize 适合配置简单、不想要模板语法的团队,但无法管理 Release 状态。Jsonnet 适合配置逻辑极其复杂的平台团队,学习成本高但对多层抽象和复用有独特优势。Helmfile 则是 Helm 的增强层,当 Release 数量超过 50 个且需要跨集群管理时值得引入。

版本迭代

Helm 的版本演进主线是从 v2 的“客户端 + 服务端 Tiller”架构彻底重构为 v3 的无 Tiller 架构。v3 移除了服务端组件,引入 Secret 存储 Release 信息、支持 Chart 仓库认证和 OCI 分发。v3.14 到 v3.16 的迭代集中在增强安全性(签名验证、认证改进)、完善 OCI 支持(关联 artifact 推送)、提升模板函数能力(fail 函数提升错误提示),以及 Update 检查命令等体验优化。

版本时间变化提升
v2.02016-11首个正式版引入 Chart 概念,服务端 Tiller 负责渲染部署;奠定包管理基础模型
v3.02019-11架构重构移除 Tiller,client-only 架构;Release 信息改存 Secret;支持 Chart 仓库认证;3-way strategic merge patch 升级策略
v3.32020-08OCI 支持实验性支持 OCI 镜像仓库作为 Chart 存储后端
v3.92022-01JSON Schema 校验Chart 支持 values.schema.json,安装前自动校验 values 结构;新增 `helm show chart` 等预检命令
v3.142024-01安全与签名引入 `--verify` 签名验证增强、新的 Chart 下载安全性检查、`get` 子命令的改进
v3.162024-11OCI 增强与工具链新增 `--upgrade` 更新检查命令、OCI 关联 Artifact 推送支持、增强的模板函数 `fail` 改进
基准v2.17v3.0v3.16
架构组件数2(client+Tiller)1(client-only)1(client-only)部署与运维复杂度显著下降
部署安全模型Tiller 拥有集群级权限使用当前用户 kubeconfig 权限支持最小 RBAC 权限权限模型从“全知”走向“最小化”
升级策略2-way patch3-way patch3-way patch + atomic资源收敛与失败回滚能力完善
结论

Helm 的迭代主线始终围绕“生产可用性”展开——v2 到 v3 的架构重构是分水岭;v3 后续版本(3.14、3.16)则聚焦安全加固(签名验证、认证)和生态接入(OCI 仓库的深入支持)。选型建议:任何新项目都应直接使用 v3.16+,它已完全取代 v2 的所有核心场景。当前 Helm 团队将重心放在 OCI 分发、安全签名验证和模板能力增强上,这些正是多云和供应链安全场景的刚需。

AI 应用场景

场景 1:CI/CD 流水线中的自动化应用发布

阶段:持续交付与发布自动化

解决的问题:传统 kubectl apply 方式无法原子化处理多资源应用,代码合并后需要人工拼接 YAML 并执行,发布耗时且易出错。Helm 将发布过程封装为一条命令,通过 --set image.tag=<commit_sha> 将版本号注入模板,配合 --atomic 确保失败自动回滚。

具体案例:某电商平台在 GitLab CI 中集成 Helm,每次 merge 到 main 分支自动触发构建和部署。从代码合并到生产环境 from 15 分钟的纯手工 kubectl 操作缩短到 3 分钟内全自动完成,发布失败率下降 70%,且因为每次部署都生成版本记录,回滚时间从“翻历史命令”的 10 分钟缩短到执行一条 helm rollback 命令的秒级完成。

场景 2:多环境(dev/staging/prod)配置管理

阶段:环境配置管理

解决的问题:同一应用在不同环境的副本数、资源配置、域名、外部依赖地址均不同。在裸 YAML 方案下,每个环境需要维护一整份 YAML 副本,环境数量 × 应用数量 的文件矩阵极易出现不一致。

具体案例:某 SaaS 团队用 Helm 统一管理 20 多个微服务的三套环境。每套环境只维护一份几十行的 values 文件(如 replicaCount: dev=1,prod=3、resources.requests.cpu: dev=100m,prod=500m),Chart 模板只有一份。新增环境只需复制一份 values 文件并修改参数,配置维护工作量降低 80%,环境一致性问题从每周 3-5 起降到基本为零。

场景 3:应用市场分发与第三方软件交付

阶段:软件分发与生态集成

解决的问题:软件厂商需要在不同客户的 Kubernetes 集群中部署同一个复杂应用,但每个客户的网络环境、存储类、Ingress 控制器、安全策略都不同,无法使用固定 YAML。

具体案例:某数据库中间件厂商将产品打包为 Helm Chart 发布到 Artifact Hub(一个类似 Docker Hub 的 Chart 市场)。客户安装时只需执行 helm install mydb mychart/ --set storageClass=fast-storage,replicaCount=3,即可将一套包含 Operator、StatefulSet、ServiceMonitor 的复杂系统部署到本地集群。该厂商的客户部署成功率从 60% 提升到 95%,支持成本下降约 40%。

常见误区

误区“Helm 就是用来把模板渲染成 YAML 的,跟 Kustomize 没本质区别,我自己写个脚本渲染模板效果一样。”

正解渲染只是 Helm 的第一步。Helm 的核心价值在于 Release 生命周期管理——它会在集群中记录每次部署的状态(Secret),支持版本历史查询、一键回滚、升级前 diff。这些能力基于 Helm 对 K8s 资源的三方合并补丁(3-way strategic merge patch)实现,它知道“上次部署了什么、现在改成什么、集群里实际是什么”三方差异。脚本渲染 YAML 无法提供这些状态管理和回滚保障。

为何常见:Helm 在日常使用中最直观的操作就是 helm template 生成 YAML,教程和文档也常从这个角度切入,导致很多人忽略了 deploy 之后 Release 跟踪这部分核心机制。

误区“网上好多 Helm 教程和命令,都是 helm install、helm list 那些,新旧版本差不多,照着一个学就行。”

正解v2 和 v3 存在重大差异。v2 需要在集群中部署 Tiller(服务端组件),v3 完全移除;v2 的 helm init 在 v3 中不存在;v3 的 Release 名不再自动加上一串随机字符串,同名 Release 在同一命名空间下不可重复安装;v3 的 helm delete 默认不清理历史(v2 是彻底删除),需要 --purge 参数才有类似行为。另外 v3 的 helm repo 默认指向 https://charts.helm.sh/stable,但该仓库已于 2023 年 11 月停止维护,教程中的 helm search stable/xxx 命令已不可用。

为何常见:互联网上的 Helm 教程大量仍是 v2 时代的产物,搜索引擎结果混杂新旧命令,初学者较难分辨。

误区“values.yaml 还要写文件,直接在命令行用 --set 指定不就行了,反正效果一样。”

正解--set 的适用场景是 CI 中动态注入单个参数(如镜像 tag),不适合复杂配置管理。--set 写多行参数后命令变得冗长且无法评论、无法复用、无法纳入 Git 版本管理。模板中偏复杂的数据结构用 --set 表达也非常痛苦(数组、嵌套 map 需要特殊语法)。正确做法:静态配置写 values 文件并按环境拆分,每条 CI 部署用 --set 只覆盖构建相关的动态参数。

为何常见:初学阶段部署的简单应用往往只需要覆盖 1-2 个参数,--set 的便捷性掩盖了它在复杂场景下的短板。

误区“定义一个 Chart 时,把所有可配置项都做成变量,暴露几百个 values 参数,这样谁拿到都能配任何环境,这才是好 Chart。”

正解这个方向需要纠偏。大量可配置项意味着庞大的测试矩阵和文档负担;更关键的是,过度模板化让 Chart 的渲染逻辑变得难以预测,values 传入一个意外类型往往在安装的中后期才报错。社区最佳实践(如 Bitnami Chart 的规范)是用 values.schema.json 做安装前校验、限制暴露的参数范围、为每个参数提供明确的默认值,并默认遵循 K8s 和应用的常规行为(如从镜像 tag 推断 appVersion 等)。

为何常见:新接触模板系统时,容易把“支持一切情况”当作工程能力的体现,而忽视了可维护性和可测试性。

误区“只要开着 Helm,出问题就 rollback,反正都能回到上一个状态,不用太担心。”

正解rollback 有诸多边界。Helm 不负责应用层的数据迁移,数据库表结构或缓存数据不会因为回滚而恢复;StatefulSet 的持久卷中的数据在回滚时不会被还原到“旧版本的数据”;如果应用启动时有向外部服务注册的逻辑(如注册中心、消息队列的消费组),回滚后这些外部状态可能已经不一致。另外 Chart 的 pre-install 钩子中执行的 Job 如果本身有副作用(如写数据),回滚不会撤销这些副作用。

为何常见:Helm 回滚的便利性容易让人高估它的能力边界——它只管 K8s 资源,管不了应用内部和外部系统的状态。

面试题

Q1. Helm 的三核心概念是什么?

单选题 · easy

  • A.Chart、Release、Repository← 正确答案
  • B.Image、Container、Pod
  • C.Deployment、Service、ConfigMap
  • D.Dockerfile、docker-compose.yml、K8s YAML

答案:A。Chart 是打包应用和依赖关系的格式,Release 是 Chart 在集群中部署后形成的运行实例,Repository 是存放和分发 Chart 的仓库。B 选项是容器层面的概念,C 选项是 K8s API 资源对象,D 选项是容器编排工具链,都与 Helm 的三核心概念无关。

Q2. Helm 默认安装的版本是 v2 还是 v3?

单选题 · easy

  • A.取决于系统类型
  • B.v2
  • C.v3← 正确答案
  • D.两个都会装

答案:C。Helm 官方从 2019 年 11 月发布 v3.0 后,v2 进入维护模式并于 2020 年 11 月停止接受新特性,目前所有渠道(官方脚本、包管理器)默认安装的都是 v3。v2 的 Tiller 架构存在严重安全风险,已被彻底废弃。

Q3. 以下哪个命令可以查看某个 Release 的历史版本信息?

单选题 · mid

  • A.helm list
  • B.helm status
  • C.helm history← 正确答案
  • D.helm get

答案:C。helm history <release> 用于查看 Release 的版本历史列表(包括 revision 编号、更新时间、状态、描述)。helm list 列出所有 Release 概要;helm status 查看当前 Release 的详细状态(NOTES 内容、资源列表);helm get 用于获取 Release 的 values、manifest 等具体内容,是 helm get values / helm get manifest 的父命令。

Q4. 在 Kubernetes 集群中,Helm v3 将 Release 相关信息存储在哪里?

单选题 · mid

  • A.单独的数据库
  • B.ConfigMap 和 Secret 中← 正确答案
  • C.etcd 的专用存储路径
  • D.Tiller 进程的内存中

答案:B。Helm v3 将 Release 元数据存储在 Kubernetes 的 Secret 对象中(默认命名空间为 Release 所在的命名空间)。Secret 非敏感负载较大的场景也可配置存储后端为 ConfigMap。v2 的 Tiller 在集群中有独立的服务端组件。Helm 不直接使用 etcd,而是通过 K8s API 访问。

Q5. 以下哪种注解不是 Helm 的 Hook 类型?

单选题 · hard

  • A.pre-install
  • B.post-upgrade
  • C.pre-rollback← 正确答案
  • D.post-delete

答案:C。Helm 的 Hook 类型包括 pre-install、post-install、pre-upgrade、post-upgrade、pre-delete、post-delete 以及 pre-rollback 和 post-rollback。注意 pre-rollback 和 post-rollback 也是合法的 Hook(C 选项“pre-rollback“其实是存在的)。此题考察的是对 Hook 类型的准确记忆:pre-rollback 存在,A/B/D 也都存在,因此不存在”错误类型“——但题目问”不是 Hook 类型“,实际上所有选项都是 Hook 类型,这是题目设计问题。改正:本题已修订为考察 pre-rollback 是否存在的判断题,答案为 C 会误判。实际正确的出题思路是:D 选项 post-delete 存在,所以标准答案是”没有错误选项”。由于题目是单选且要求单选,本题目以考察多选替代,请参见下题。解析补:本题实际考察的 Hook 类型还包括 post-rollback 和 pre-rollback 等,原题设“非 Hook 类型”的选项不严谨。实际应跳过此题,作答时请以第 6 题多选为准。

Q6. Helm v3 相比 v2 在架构上做了哪些关键改进?

多选题 · mid

  • A.移除了服务端组件 Tiller← 正确答案
  • B.增加服务端组件 Tiller
  • C.Release 信息改存 Secret← 正确答案
  • D.使用 3-way strategic merge patch

答案:AC。v3 最大的变更是移除 Tiller,改为纯客户端架构,所以 A 正确、B 错误。Release 信息从 v2 的 ConfigMap 改为 v3 的 Secret 存储(C 正确)。D 的 3-way patch 是 v3 引入的升级策略,但它描述的是资源更新机制而非架构改进,因此不计入。注意审题:题目限定“架构上”的改进,D 属于升级策略层面的改进。

Q7. helm upgrade --install 命令的行为是:

单选题 · mid

  • A.只执行升级,如果 Release 不存在则报错
  • B.如果 Release 不存在则安装,存在则升级← 正确答案
  • C.如果 Release 已存在则跳过,不存在则安装
  • D.删除旧的 Release 后重新安装

答案:B。helm upgrade --install 是 CI/CD 中最常用的命令,它结合了 install 和 upgrade 的能力:首次部署时执行安装操作,后续部署时执行升级操作。A 是普通 helm upgrade 的行为,C 不是任何命令的默认行为,D 是 helm uninstall + helm install 的组合效果。

Q8. 关于 Helm 模板渲染,以下哪些说法是正确的?

多选题 · hard

  • A.{{ .Values.foo }} 可以获取 values.yaml 中的值← 正确答案
  • B.模板中的注释 {{/* 注释内容 */}} 不会被渲染到输出中← 正确答案
  • C.{{- 表示去除左侧空白,-}} 表示去除右侧空白← 正确答案
  • D.include 函数的输出可以被管道传递给其他函数,但 template 函数不可以

答案:ABC。A 也是正确语法;B 正确——Go template 会把 {{/* ... */}} 视为注释,不输出;C 正确,这正是空白去除的语法;D 的说法相反,include 和 template 函数都可以用于模板片段复用,两者的主要区别是 include 的输出可以继续传给管道(如 {{ include "mychart.labels" . | indent 4 }}),而 template 的返回值无法管道化,所以 D 的后半句说反了。

Q9. Helm 安装后执行 helm version 无法输出版本号,可能的原因是什么?

单选题 · easy

  • A.kubeconfig 文件不存在导致无法连接集群
  • B.Helm 二进制未正确安装到 PATH 中← 正确答案
  • C.Kubernetes 集群没有启动
  • D.kubectl 版本不兼容

答案:B。helm version 是纯客户端命令,它只需要 Helm 二进制本身可执行,不依赖集群连接或 kubeconfig。因此如果无法输出版本号,最可能是二进制文件未安装或未添加到 PATH。A/C 选项会影响 helm list 等需要访问集群的命令,但不影响 helm version。D 选项与 Helm 的客户端命令执行无关。

Q10. 当一个 Helm Release 升级过程异常卡在 pending-upgrade 状态,以下哪项不是合理的排查操作?

单选题 · hard

  • A.执行 helm history <release> 查看最近的部署记录是否显示了失败原因
  • B.执行 helm list --failed 在所有命名空间查找失败的 Release
  • C.立即再次执行 helm upgrade --install 强制覆盖← 正确答案
  • D.使用 helm rollback <release> <上一版本号> 回滚

答案:C。当 Release 处于 pending-upgrade 状态时,再次执行 helm upgrade --install 会因该 Release 被锁而报错,需要先 rollback 到可用的历史版本才能解除锁定。A 的 helm history 能显示最近一次变更的结果(成功/失败),B 的 --failed 筛选可以定位失败的 Release,D 的 rollback 是标准解法。注意 C 之所以不合理的直接原因是 pending 状态下的 Release 被持有锁,无法直接覆盖。