Helm 面试题
30 道题- 分类
- Kubernetes
- 题目数
- 30 道
1 Helm 的核心组件和架构是怎样的?
答案:
Helm 采用客户端-库架构,核心组件包括 Helm CLI、Helm SDK、Chart 和 Repository。
- Helm CLI:用户操作的命令行工具,负责 Chart 的安装、升级、回滚和卸载
- Helm SDK:Go 语言库,封装了 Chart 解析、模板渲染、Kubernetes 资源交互等核心逻辑
- Chart:打包的 Kubernetes 资源模板集合,包含 Chart.yaml、values.yaml、templates/ 等目录
- Repository:Chart 的存储和分发仓库(如 ArtifactHUB、OCI Registry)
- Release:在 Kubernetes 集群中运行的一个 Chart 实例,具有唯一的名称和版本号
工作流程:
helm install my-release bitnami/nginx
→ Helm CLI 读取 Chart
→ 合并 values.yaml 和用户自定义值
→ 渲染 Go Template
→ 将生成的 YAML 提交到 Kubernetes API
→ 创建 Release(存储在 Secret 中)
Helm v3 与 v2 的核心变化:
- Tiller 移除:v3 移除服务器端组件 Tiller,直接通过 kubeconfig 与 K8s API 交互,消除安全风险
- Release 存储:Release 信息存储在 Secret 中(v2 在 ConfigMap),支持加密
- JSON Schema:支持 values.schema.json 校验用户输入
- OCI 支持:直接使用容器镜像仓库存储 Chart
2 Helm Chart 的目录结构是怎样的?每个文件有什么用?
答案:
标准的 Helm Chart 目录结构如下:
graph TD
A["mychart/"] --> B["Chart.yaml<br/>Chart 元数据"]
A --> C["values.yaml<br/>默认配置值"]
A --> D["values.schema.json<br/>JSON Schema 校验(可选)"]
A --> E["charts/<br/>子 Chart 依赖"]
A --> F["templates/<br/>Go Template 模板文件"]
F --> F1["_helpers.tpl<br/>可复用的模板辅助函数"]
F --> F2["deployment.yaml<br/>Deployment 资源模板"]
F --> F3["service.yaml<br/>Service 资源模板"]
F --> F4["ingress.yaml<br/>Ingress 资源模板"]
F --> F5["hpa.yaml<br/>HPA 资源模板"]
F --> F6["NOTES.txt<br/>安装后的提示信息"]
A --> G["crds/<br/>CRD 定义"]
A --> H["README.md<br/>使用文档"]
A --> I[".helmignore<br/>打包时忽略的文件列表"]
各文件的作用:
- Chart.yaml:
apiVersion,name,version,appVersion,description,dependencies,定义 Chart 身份和依赖关系 - values.yaml:模板渲染的输入变量,支持层次化结构,用户可通过
-f或--set覆盖 - values.schema.json:对 values 进行类型、范围、必填校验,无效配置直接报错
- templates/_helpers.tpl:定义可复用的模板片段,通过
{{ include "mychart.name" . }}引用 - NOTES.txt:安装成功后打印的指引信息(如访问地址、默认密码获取命令)
3 Helm 模板语法核心概念有哪些?
答案:
Helm 模板基于 Go text/template 扩展,核心概念包括内置对象、函数和流程控制。
内置对象:
| 对象 | 含义 | 示例 |
|---|---|---|
.Values | values.yaml 和用户传入值的合并 | {{ .Values.replicaCount }} |
.Release | Release 元数据 | {{ .Release.Name }}, {{ .Release.Namespace }} |
.Chart | Chart.yaml 信息 | {{ .Chart.Name }}, {{ .Chart.Version }} |
.Files | Chart 内文件访问 | {{ .Files.Get "config.yaml" }} |
.Capabilities | K8s 集群能力 | {{ .Capabilities.APIVersions.Has "apps/v1" }} |
.Template | 当前模板信息 | {{ .Template.Name }} |
流程控制:
# if-else
XQOPEN if .Values.persistence.enabled XQCLOSE
persistence:
enabled: true
size: XQOPEN .Values.persistence.size XQCLOSE
XQOPEN end XQCLOSE
# range 循环
XQOPEN range .Values.ports XQCLOSE
- name: XQOPEN .name XQCLOSE
containerPort: XQOPEN .containerPort XQCLOSE
XQOPEN end XQCLOSE
# with 作用域
XQOPEN with .Values.securityContext XQCLOSE
securityContext:
runAsUser: XQOPEN .runAsUser XQCLOSE
fsGroup: XQOPEN .fsGroup XQCLOSE
XQOPEN end XQCLOSE
函数与管道:
# 默认值
replicas: XQOPEN .Values.replicaCount | default 1 XQCLOSE
# 大小写转换
name: XQOPEN .Values.appName | upper XQCLOSE
env: XQOPEN .Values.env | lower XQCLOSE
# 缩进对齐
XQOPEN .Files.Get "config.yaml" | indent 4 XQCLOSE
# include 引用
XQOPEN include "mychart.labels" . | nindent 4 XQCLOSE
# quote 和 squote
name: XQOPEN .Values.name | quote XQCLOSE
# tpl(字符串模板渲染)
XQOPEN tpl .Values.templateString . XQCLOSE
4 Helm 如何管理依赖(Dependency)?
答案:
Helm 通过 Chart.yaml 的 dependencies 字段声明子 Chart 依赖。
声明依赖:
# Chart.yaml
dependencies:
- name: postgresql
version: "12.x"
repository: "https://charts.bitnami.com/bitnami"
condition: postgresql.enabled # 条件启用
tags:
- database
- name: redis
version: "17.x"
repository: "https://charts.bitnami.com/bitnami"
condition: redis.enabled
tags:
- cache
- name: local-chart
version: "0.1.0"
repository: "file://../local-chart" # 本地路径
依赖管理命令:
# 下载依赖到 charts/ 目录
helm dependency update
# 构建依赖(更新 Chart.lock)
helm dependency build
# 列出依赖
helm dependency list
父子 Chart 的值传递:
# 父 Chart values.yaml
postgresql:
enabled: true
auth:
database: myapp
username: myapp
redis:
enabled: false
5 Helm 如何处理 CRD(Custom Resource Definition)?
答案:
Helm v3 对 CRD 有专门的处理机制,在 crds/ 目录中的 CRD 会在模板渲染前安装。
CRD 目录规则:
graph TD
A["mychart/"] --> B["crds/"]
B --> B1["crd-prometheus.yaml"]
B --> B2["crd-servicemonitor.yaml"]
A --> C["templates/"]
C --> C1["prometheus.yaml<br/>引用 CRD 的资源"]
CRD 行为:
| 操作 | CRD 处理 |
|---|---|
| helm install | 先安装 crds/ 下的 CRD,再渲染 templates/ |
| helm upgrade | 不更新 crds/ 下的 CRD(K8s 限制 CRD 更新) |
| helm uninstall | 不删除 CRD(防止删除其他释放的 CRD 实例) |
| helm template | 不处理 crds/(仅本地渲染) |
注意事项:
- CRD 安装后不可修改 spec 字段
- CRD 升级需要手动 kubectl apply 或 Helm post-upgrade hook
- CRD 删除会导致所有该类型的 CR 实例丢失
6 Helm Hooks 机制是什么?有什么用途?
答案:
Helm Hooks 是在 Release 生命周期的特定节点执行的特殊模板资源,用于执行初始化、备份、验证等任务。
Hook 类型:
| Hook | 执行时机 | 适用场景 |
|---|---|---|
| pre-install | 模板渲染后、资源创建前 | 创建数据库、生成密钥 |
| post-install | 所有资源创建后 | 初始化数据、通知 |
| pre-upgrade | 升级模板渲染后、资源更新前 | 备份数据库、预检查 |
| post-upgrade | 升级完成 | 数据迁移、通知 |
| pre-delete | 删除前 | 释放外部资源 |
| post-delete | 删除后 | 清理、通知 |
| pre-rollback | 回滚前 | 备份当前状态 |
| post-rollback | 回滚后 | 验证恢复 |
| test | helm test 执行 | 运行集成测试 |
Hook 示例:
apiVersion: batch/v1
kind: Job
metadata:
name: XQOPEN .Release.Name XQCLOSE-db-migrate
annotations:
"helm.sh/hook": post-upgrade
"helm.sh/hook-weight": "5" # 执行顺序(数值越小越先)
"helm.sh/hook-delete-policy": hook-succeeded # 成功后删除
spec:
template:
spec:
containers:
- name: migrate
image: myapp/migrate:latest
command: ["/bin/migrate.sh"]
restartPolicy: Never
7 Helm 的 values 覆盖优先级是怎样的?
答案:
Helm 的 value 来源有明确优先级,高优先级会覆盖低优先级。
优先级(从低到高):
- Chart 自带的 values.yaml(最低优先级)
- 父 Chart 对子 Chart 的 values 覆盖(子 Chart 作为依赖时)
helm install -f myvalues.yaml或-f myvalues.json传入的文件--set key=value设置的单个值--set-json key=jsonValue设置的 JSON 值--set-string key=stringValue强制字符串类型
覆盖示例:
# 优先级从高到低
helm install myapp ./mychart \
--set image.tag=prod-latest \ # 最高
--values prod-values.yaml \ # 次高
-f custom-values.yaml # 第三
合并规则:
- YAML 合并采用深度合并(deep merge),非简单替换
- 列表默认替换而非追加(可通过 strategy 修改)
--set支持逗号分隔和 JSON 路径:--set a.b.c=value
8 Helm 如何处理升级和回滚?
答案:
Helm v3 使用三路策略合并补丁(3-way strategic merge patch)进行升级和回滚。
**升级流程:``` helm upgrade myapp ./mychart -f new-values.yaml → 读取当前 Release 的 Manifest(上次安装的 YAML) → 用新 values 重新渲染模板 → 新 Manifest → 三路合并(旧 Manifest + 新 Manifest + 当前集群状态) → 计算 Patch → 应用到 K8s API
**三路合并优势:** 手动修改过的 K8s 资源不会被直接覆盖,Helm 会识别集群状态差异并尝试智能合并。
**回滚:**
```bash
# 查看 Release 历史
helm history myapp
# REVISION STATUS CHART APP VERSION DESCRIPTION
# 1 deployed mychart-1.0.0 1.0 Install complete
# 2 deployed mychart-1.1.0 1.1 Upgrade complete
# 3 failed mychart-1.2.0 1.2 Upgrade failed
# 回滚到版本 2
helm rollback myapp 2
# 指定回滚参数
helm rollback myapp 2 --wait --timeout 5m
回滚行为:
- 回滚 = 使用旧 Revision 的 values 重新渲染并应用
- 回滚本身会创建新 Revision
- 回滚不影响 Secret 中存储的历史
9 Helm 如何处理大规模部署(--wait / --timeout)?
答案:
Helm 提供安装后的资源就绪等待机制。
helm install myapp ./mychart \
--wait \ # 等待所有 Pod 进入 Ready
--timeout 10m \ # 超时时间
--atomic \ # 失败时自动回滚
--create-namespace # 自动创建命名空间
等待资源类型:
- Deployment / StatefulSet:等待可用副本数达到期望
- Job:等待 Pod 执行完成
- Service:等待 Endpoint 分配
- PVC:等待 PV 绑定
- Pod:等待 Ready 状态
10 Helm 如何处理多环境(dev/staging/prod)配置?
答案:
Helm 通过分层 values 文件实现多环境配置管理。
values 分层文件:
graph TD
A["config/"] --> B["values.yaml<br/>公共基础配置"]
A --> C["values-dev.yaml<br/>开发环境覆盖"]
A --> D["values-staging.yaml<br/>预发布覆盖"]
A --> E["values-prod.yaml<br/>生产覆盖"]
安装命令:
# 开发
helm install myapp ./mychart -f config/values.yaml -f config/values-dev.yaml
# 生产
helm upgrade myapp ./mychart \
-f config/values.yaml \
-f config/values-prod.yaml \
--set image.tag=v1.2.3
values.yaml(基础):
replicaCount: 1
resources:
requests:
cpu: 100m
memory: 128Mi
ingress:
enabled: false
values-prod.yaml(覆盖):
replicaCount: 5
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 2
memory: 2Gi
ingress:
enabled: true
hosts:
- app.prod.example.com
11 Helm 的 OCI 注册表支持是什么?
答案:
Helm v3.8+ 支持将 Chart 直接存储在 OCI(Open Container Initiative)兼容的容器镜像仓库中。
OCI 操作:
# 登录 OCI 注册表
helm registry login registry.example.com
# 推送 Chart 到 OCI
helm package mychart
helm push mychart-1.0.0.tgz oci://registry.example.com/helm-charts
# 从 OCI 安装
helm install myapp oci://registry.example.com/helm-charts/mychart --version 1.0.0
# 从 OCI 拉取
helm pull oci://registry.example.com/helm-charts/mychart --version 1.0.0
优势:
- 统一用容器镜像仓库,无需独立 Chart 仓库
- 支持镜像仓库的访问控制(RBAC、签名)
- 支持镜像仓库的复制同步
12 Helm 的验证和测试机制是什么?
答案:
Helm 提供内置的 Chart 验证和测试功能。
Chart Lint:
# 语法检查
helm lint ./mychart
# 带严格模式
helm lint ./mychart --strict
# 检查结果:YAML 格式、模板渲染、values 完整性
JSON Schema 校验:
{
"$schema": "https://json-schema.org/draft-07/schema",
"type": "object",
"required": ["image", "replicaCount"],
"properties": {
"image": {
"type": "object",
"required": ["repository", "tag"],
"properties": {
"repository": { "type": "string" },
"tag": { "type": "string", "pattern": "^v?[0-9]+\\.[0-9]+" }
}
},
"replicaCount": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
}
}
Test(helm test):
apiVersion: v1
kind: Pod
metadata:
name: "XQOPEN .Release.Name XQCLOSE-connection-test"
annotations:
"helm.sh/hook": test
spec:
containers:
- name: test
image: curlimages/curl
command:
- curl
- http://XQOPEN .Release.Name XQCLOSE-svc:80
restartPolicy: Never
helm test myapp
13 Helm 如何处理 Chart 的签名和验证?
答案:
Helm 支持 Chart 的 GPG 签名,确保 Chart 来源可信和完整性。
签名流程:
# 生成 GPG 密钥
gpg --full-generate-key
# 签名 Chart
helm package --sign --key 'my-key' --keyring ~/.gnupg/secring.gpg ./mychart
# 生成 mychart-1.0.0.tgz + mychart-1.0.0.tgz.prov
# 验证签名
helm verify mychart-1.0.0.tgz
验证配置:
# 安装时验证
helm install myapp ./mychart-1.0.0.tgz --verify
# 配置信任密钥
helm repo add myrepo https://charts.example.com \
--ca-file ca.crt \
--cert-file client.crt \
--key-file client.key
14 Helm Subchart 和 Global Values 的作用?
答案:
Subchart 是 Chart 的嵌套依赖,Global Values 允许父子 Chart 共享值。
Subchart 特点:
- Subchart 被视为独立 Chart,有自己的 values.yaml 和 templates/
- 父 Chart 的模板不能直接访问子 Chart 的值
- 子 Chart 的 values 通过父 Chart 的
${子Chart名}.${key}路径覆盖
Global Values:
# 父 Chart values.yaml
global:
imageRegistry: "registry.internal.company.com"
env: production
subchart1:
enabled: true
# 子 Chart 模板引用全局值
image: "XQOPEN .Values.global.imageRegistry XQCLOSE/myapp:XQOPEN .Values.image.tag XQCLOSE"
Global Values 传递规则:
- Global 值自动从父 Chart 传递到所有子 Chart
- 子 Chart 可以覆盖自己的非 global 值
- Global 值是跨 Chart 共享的首选方式
15 Helm 的 PostRenderer 机制是什么?
答案:
PostRenderer 是 Helm 在模板渲染后执行的命令管道,允许在提交到 K8s 前进行 YAML 后处理。
# 使用 kustomize 作为 PostRenderer
helm install myapp ./mychart \
--post-renderer ./kustomize-wrapper.sh
典型用途:
#!/bin/bash
# kustomize-wrapper.sh
cat <&0 > /tmp/rendered.yaml
kubectl kustomize /tmp/rendered
- 注入 Sidecar(如 Istio)
- 添加通用 Label/Annotation
- 密钥加密(SealedSecrets)
- 资源转换(Helm → Kustomize 混合使用)
16 Helm 的 Library Chart 是什么?用于什么场景?
答案:
Library Chart 是只包含模板辅助函数(_helpers.tpl)的 Chart,不安装任何资源。
Library Chart 定义:
# common/Chart.yaml
apiVersion: v2
name: common
type: library # 标记为 Library Chart
version: 1.0.0
# common/templates/_helpers.tpl
XQOPEN- define "common.name" -XQCLOSE
XQOPEN- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" XQCLOSE
XQOPEN- end XQCLOSE
XQOPEN- define "common.labels" -XQCLOSE
app.kubernetes.io/name: XQOPEN include "common.name" . XQCLOSE
app.kubernetes.io/instance: XQOPEN .Release.Name XQCLOSE
XQOPEN- end XQCLOSE
XQOPEN- define "common.probe" -XQCLOSE
initialDelaySeconds: XQOPEN .delay | default 5 XQCLOSE
periodSeconds: XQOPEN .period | default 10 XQCLOSE
XQOPEN- end XQCLOSE
使用 Library Chart:
# mychart/Chart.yaml
dependencies:
- name: common
version: 1.0.0
repository: file://../common
# mychart/templates/deployment.yaml
XQOPEN include "common.labels" . XQCLOSE
livenessProbe:
XQOPEN include "common.probe" . | nindent 2 XQCLOSE
17 Helm 如何管理大规模的 Release 文件?
答案:
Helm v3 将 Release 信息存储在 Kubernetes Secret 中,每次更新都会创建新的 Secret。
# 查看 Release Secret
kubectl get secrets -n mynamespace | grep sh.helm.release
# 查看 Secret 中的 Release 数据
kubectl get secret sh.helm.release.v1.myapp.v1 -o jsonpath='{.data.release}' | base64 -d | base64 -d | gunzip
Release 存储优化:
# 限制历史版本数量
helm upgrade myapp ./mychart --history-max 5
# 手动清理历史
helm history myapp --max 10
helm delete myapp --keep-history # 保留 Release 记录
18 Helm 如何与 ArgoCD 集成?
答案:
ArgoCD 原生支持 Helm Chart 作为应用来源。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp
spec:
source:
repoURL: https://git.example.com/helm-charts
path: mychart
targetRevision: HEAD
helm:
valueFiles:
- values.yaml
- values-prod.yaml
parameters:
- name: image.tag
value: v1.2.3
releaseName: myapp
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true
selfHeal: true
19 Helm Secrets 如何处理敏感信息?
答案:
Helm 本身不加密 values,需要结合外部工具处理敏感信息。
方案 1:Helm Secrets + SOPS
# secrets.yaml(加密文件)
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
stringData:
password: ENC[AES256_GCM,data:encrypted-base64]
helm secrets install myapp ./mychart -f secrets.yaml
方案 2:External Secrets Operator
# Chart 中引用 ExternalSecret
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: myapp-secret
spec:
refreshInterval: 1h
secretStoreRef:
name: vault-backend
kind: ClusterSecretStore
target:
name: myapp-secret
data:
- secretKey: password
remoteRef:
key: /myapp/password
方案 3:Sealed Secrets
# 加密 Secret
kubeseal --format yaml < secret.yaml > sealed-secret.yaml
# Chart 中包含 SealedSecret,Helm 安装后由 sealed-secrets controller 解密
20 Helm 的 Hooks 权重和删除策略如何配置?
答案:
apiVersion: batch/v1
kind: Job
metadata:
name: pre-upgrade-job
annotations:
"helm.sh/hook": pre-upgrade
"helm.sh/hook-weight": "-5" # 负数权重 = 更早执行
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
spec:
template:
spec:
restartPolicy: Never
containers:
- name: job
image: busybox
command: ["sh", "-c", "echo pre-upgrade check"]
删除策略说明:
| 策略 | 行为 |
|---|---|
| hook-succeeded | Hook 执行成功后被删除 |
| hook-failed | Hook 执行失败后被删除 |
| before-hook-creation | 新 Hook 创建前删除旧的 |
| 默认 | 保留 Hook 资源 |
21 Helm 如何限制 Chart 的最低 K8s 版本?
答案:
# Chart.yaml
apiVersion: v2
name: mychart
version: 1.0.0
kubeVersion: ">= 1.21.0-0" # 最低 K8s 版本
版本约束语法:
>= 1.21:版本大于等于 1.21>= 1.21 < 1.25:版本范围~1.22:1.22.x 版本^1.22:1.22.x 或以上
22 Helm 的 Capabilities 对象如何使用?
答案:
Capabilities 对象用于根据集群能力条件渲染模板。
# 根据 K8s 版本选择 API 版本
XQOPEN- if .Capabilities.APIVersions.Has "apps/v1" XQCLOSE
apiVersion: apps/v1
XQOPEN- else XQCLOSE
apiVersion: extensions/v1beta1
XQOPEN- end XQCLOSE
# 检查特定 CRD 是否存在
XQOPEN- if .Capabilities.APIVersions.Has "monitoring.coreos.com/v1" XQCLOSE
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
XQOPEN- end XQCLOSE
# 根据 K8s 版本选择特性
XQOPEN- if semverCompare ">=1.21-0" .Capabilities.KubeVersion.Version XQCLOSE
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
XQOPEN- end XQCLOSE
23 Helm 如何自定义安装后的提示信息(NOTES.txt)?
答案:
# templates/NOTES.txt
Thank you for installing XQOPEN .Chart.Name XQCLOSE.
Your application is running at:
http://XQOPEN .Values.ingress.host XQCLOSE
Get the admin password:
kubectl get secret XQOPEN .Release.Name XQCLOSE-admin -o jsonpath="{.data.password}" | base64 --decode
To test the connection:
helm test XQOPEN .Release.Name XQCLOSE
24 Helm 的 lookup 函数是什么?
答案:
lookup 函数在模板渲染时查询集群中的已有资源。
# 查询已有 ConfigMap
XQOPEN- $cm := lookup "v1" "ConfigMap" .Release.Namespace "myconfig" XQCLOSE
XQOPEN- if $cm XQCLOSE
configData: XQOPEN $cm.data XQCLOSE
XQOPEN- else XQCLOSE
configData: {}
XQOPEN- end XQCLOSE
# 查询 Secret 是否存在(避免覆盖已有密钥)
XQOPEN- $existingSecret := lookup "v1" "Secret" .Release.Namespace (printf "%s-db" .Release.Name) XQCLOSE
XQOPEN- if not $existingSecret XQCLOSE
apiVersion: v1
kind: Secret
metadata:
name: XQOPEN .Release.Name XQCLOSE-db
data:
password: XQOPEN randAlphaNum 16 | b64enc XQCLOSE
XQOPEN- end XQCLOSE
25 Helm 的 fail 函数是什么?
答案:
fail 函数用于模板渲染时主动终止并输出错误信息。
XQOPEN- if and (.Values.ingress.enabled) (not .Values.ingress.host) XQCLOSE
XQOPEN- fail "ingress.host is required when ingress is enabled" XQCLOSE
XQOPEN- end XQCLOSE
XQOPEN- if and (.Values.persistence.enabled) (not .Values.storageClass) XQCLOSE
XQOPEN- fail "storageClass is required for persistent storage" XQCLOSE
XQOPEN- end XQCLOSE
# 版本兼容性检查
XQOPEN- if not (semverCompare ">=1.21-0" .Capabilities.KubeVersion.Version) XQCLOSE
XQOPEN- fail "Kubernetes version must be >= 1.21" XQCLOSE
XQOPEN- end XQCLOSE
26 Helm 如何实现条件安装(Conditional Installation)?
答案:
# values.yaml
ingress:
enabled: false
monitoring:
enabled: true
serviceMonitor:
enabled: "XQOPEN .Values.monitoring.enabled XQCLOSE"
# templates/ingress.yaml
XQOPEN- if .Values.ingress.enabled XQCLOSE
apiVersion: networking.k8s.io/v1
kind: Ingress
...
XQOPEN- end XQCLOSE
# templates/servicemonitor.yaml
XQOPEN- if .Values.serviceMonitor.enabled XQCLOSE
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
...
XQOPEN- end XQCLOSE
27 Helm 的 template 命令和 install --dry-run 的区别?
答案:
| 维度 | helm template | helm install --dry-run |
|---|---|---|
| 访问 K8s API | 不访问 | 访问(lookup 可用) |
| 验证 Release 名称 | 不验证 | 验证是否已存在 |
| 输出 | 控制台 YAML | 控制台 YAML |
| 使用场景 | CI/CD 管道渲染 | 开发调试 |
| Capabilities | 固定默认值 | 真实集群信息 |
28 Helm 如何处理复杂的多 Chart 部署?
答案:
方案 1:Helm Dependency(父子 Chart) 方案 2:Helmfile(多 Chart 编排) 方案 3:ArgoCD ApplicationSet(GitOps 方式)
Helmfile 示例:
# helmfile.yaml
repositories:
- name: bitnami
url: https://charts.bitnami.com/bitnami
releases:
- name: postgresql
namespace: database
chart: bitnami/postgresql
version: 12.x
values:
- values/postgresql.yaml
- name: myapp
namespace: myapp
chart: ./charts/myapp
values:
- values/myapp.yaml
needs:
- database/postgresql
# 部署所有 Release
helmfile apply
# 查看差异
helmfile diff
29 Helm 的 --generate-name 和 --name-template 的作用?
答案:
# 自动生成 Release 名称
helm install --generate-name ./mychart
# Release: mychart-1712345678
# 使用模板生成名称
helm install --name-template "myapp-XQOPEN .Chart.Version XQCLOSE" ./mychart
# Release: myapp-1.0.0
30 Helm Chart 生产环境最佳实践?
答案:
Chart 开发规范:
- 所有可配置项暴露在 values.yaml 中,并有默认值
- 提供 values.schema.json 校验用户输入
- 使用 Library Chart 提取通用模板逻辑
- 模板中不使用硬编码值(IP、端口等)
- 使用 include 而非 template(支持作用域传递)
安全实践:
- 不将敏感信息(密码、Token)硬编码在 values.yaml
- 使用 Helm Secrets 或 External Secrets Operator 管理密钥
- 启用 Chart 签名和验证
- 设置
--history-max限制 Release 数量
CI/CD 集成:
- CI 中运行
helm lint和helm template验证 - 使用
--dry-run验证集群兼容性 - 生产环境使用
--atomic确保失败自动回滚 - 使用 Helmfile 或 ArgoCD 管理多 Chart 部署
版本管理:
- Chart version 遵循 SemVer(语义化版本)
- appVersion 与应用版本保持一致
- 重大变更时增加 Chart 主版本号
- 使用 README.md 记录变更日志