4. Helm Chart 结构详解:Chart.yaml、values.yaml、templates 目录、NOTES.txt、helpers.tpl
在将 Helm Chart 接入云原生网关回滚护栏并进行租户配额校准之前,必须透彻理解 Chart 的标准目录结构与各文件的职责。一个标准的 Helm Chart 包含以下核心文件与目录:
| 文件/目录 | 必需 | 核心职责 | 配额校准场景中的关键作用 |
|---|---|---|---|
| Chart.yaml | 是 | Chart 元数据定义(名称、版本、依赖) | 声明 Chart 版本与租户配额 API 版本对齐 |
| values.yaml | 是 | 默认配置值定义 | 定义租户配额默认值、回滚阈值、网关端点 |
| templates/ | 是 | Kubernetes 资源模板(Go 模板语法) | 生成配额校验 Job、ConfigMap、网关路由规则 |
| NOTES.txt | 否 | 安装/升级后的使用说明 | 输出配额校准结果与回滚状态提示 |
| helpers.tpl | 否 | 可复用的模板函数(通常位于 _helpers.tpl) | 封装配额计算、命名规范、标签生成逻辑 |
实战提示:在租户配额校准场景中,
helpers.tpl 是复用率最高的文件。建议将配额校验逻辑、回滚判定条件、租户标识生成函数统一放在 _helpers.tpl 中,避免在多个模板中重复编写相同逻辑。
4.1 Chart.yaml — Chart 的身份证
Chart.yaml 是每个 Helm Chart 的入口文件,定义了 Chart 的名称、版本、描述、依赖关系等元数据。在租户配额校准场景中,该文件需要额外声明配额 API 版本兼容性。
apiVersion: v2
name: tenant-quota-calibrator
description: 租户配额校准 Chart,集成云原生网关回滚护栏
type: application
version: 1.2.0
appVersion: "1.2.0"
kubeVersion: ">=1.21.0-0"
keywords:
- tenant
- quota
- calibration
- gateway
- rollback
home: https://example.com/tenant-quota-calibrator
sources:
- https://github.com/example/tenant-quota-calibrator
dependencies:
- name: common
version: ">=2.0.0"
repository: "https://charts.example.com"
condition: common.enabled
annotations:
quota.api.version: "v1beta1"
rollback.guardrail.enabled: "true"
关键字段说明:
annotations:自定义注解,用于声明配额 API 版本(quota.api.version)和回滚护栏启用状态(rollback.guardrail.enabled)。这些注解会被 Helm 钩子和外部工具读取。dependencies:声明对公共库 Chart 的依赖,避免重复编写通用配额校验逻辑。kubeVersion:限制 Chart 部署的 Kubernetes 版本,确保回滚护栏的 CRD 可用。
4.2 values.yaml — 默认配置的中央仓库
values.yaml 定义了 Chart 的所有可配置参数及其默认值。在租户配额校准场景中,该文件需要包含租户配额阈值、回滚策略、网关连接信息等核心配置。
# 租户配额校准全局配置
global:
tenantId: "default-tenant"
environment: "production"
# 配额阈值配置
quota:
cpu:
limit: "4"
request: "2"
burst: "6"
memory:
limit: "8Gi"
request: "4Gi"
burst: "12Gi"
storage:
capacity: "100Gi"
class: "ssd"
# 回滚护栏配置
rollback:
guardrail:
enabled: true
maxRetries: 3
cooldownPeriod: "30s"
thresholdViolationPercent: 20
# 云原生网关配置
gateway:
endpoint: "https://gateway.example.com"
: ""
timeout: "10s"
# 配额校准 Job 配置
calibration:
schedule: "*/30 * * * *"
image:
repository: "example/quota-calibrator"
tag: "1.2.0"
pullPolicy: "IfNotPresent"
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
注意:
gateway. 不应直接写在 values.yaml 中。生产环境应使用 Kubernetes Secret 注入,或在 CI/CD 流水线中通过 --set 参数覆盖。本课程后续章节将演示如何通过 Helm 钩子从 Secret 中读取敏感信息。
4.3 templates/ 目录 — 资源模板的核心
templates/ 目录包含所有 Kubernetes 资源模板文件,使用 Go 模板语法渲染。在租户配额校准场景中,该目录通常包含以下模板:
- quota-job.yaml:创建 CronJob 或 Job,执行租户配额校验与校准逻辑。
- configmap.yaml:存储配额校准脚本或配置文件。
- gateway-route.yaml:定义云原生网关的路由规则,用于回滚护栏。
- rbac.yaml:为配额校准 Job 创建 ServiceAccount 和 RBAC 权限。
- hpa.yaml:可选,根据配额使用率自动扩缩容。
{{- /* templates/quota-job.yaml */ -}}
apiVersion: batch/v1
kind: CronJob
metadata:
name: {{ include "tenant-quota-calibrator.fullname" . }}-calibrator
labels:
{{- include "tenant-quota-calibrator.labels" . | nindent 4 }}
spec:
schedule: "{{ .Values.calibration.schedule }}"
jobTemplate:
spec:
template:
spec:
serviceAccountName: {{ include "tenant-quota-calibrator.serviceAccountName" . }}
containers:
- name: calibrator
image: "{{ .Values.calibration.image.repository }}:{{ .Values.calibration.image.tag }}"
env:
- name: TENANT_ID
value: "{{ .Values.global.tenantId }}"
- name: QUOTA_CPU_LIMIT
value: "{{ .Values.quota.cpu.limit }}"
- name: QUOTA_MEM_LIMIT
value: "{{ .Values.quota.memory.limit }}"
- name: GATEWAY_ENDPOINT
value: "{{ .Values.gateway.endpoint }}"
- name: ROLLBACK_ENABLED
value: "{{ .Values.rollback.guardrail.enabled }}"
restartPolicy: OnFailure
模板函数使用规范:
include:调用_helpers.tpl中定义的命名模板,如tenant-quota-calibrator.fullname。nindent:在 YAML 中保持正确的缩进层级。default:为可选值提供默认值,避免渲染错误。
4.4 NOTES.txt — 安装后的用户指引
NOTES.txt 在 helm install 或 helm upgrade 成功后自动输出。在配额校准场景中,该文件用于向用户展示配额状态、回滚护栏状态以及后续操作指引。
租户配额校准 Chart 已成功部署!
部署信息:
租户 ID: {{ .Values.global.tenantId }}
环境: {{ .Values.global.environment }}
配额 CPU 限制: {{ .Values.quota.cpu.limit }} 核
配额内存限制: {{ .Values.quota.memory.limit }}
回滚护栏: {{ if .Values.rollback.guardrail.enabled }}已启用{{ else }}未启用{{ end }}
访问配额校准状态:
kubectl get cronjob -n {{ .Release.Namespace }} | grep calibrator
查看最近一次校准日志:
kubectl logs -n {{ .Release.Namespace }} job/$(kubectl get jobs -n {{ .Release.Namespace }} --sort-by=.metadata.creationTimestamp -o jsonpath='{.items[-1].metadata.name}')
注意:如果配额超出阈值,回滚护栏将自动触发回滚操作。
最佳实践:在
NOTES.txt 中提供可直接复制的命令,降低用户操作门槛。同时,建议在模板中使用条件判断(如 if),根据配置动态显示不同内容。
4.5 helpers.tpl — 模板函数的复用中枢
_helpers.tpl(通常命名为 _helpers.tpl)是 Helm Chart 中定义可复用模板函数的文件。在租户配额校准场景中,该文件承担以下核心职责:
- 命名规范统一:生成统一的资源名称、标签、选择器。
- 配额计算逻辑:封装配额阈值计算、百分比校验等函数。
- 回滚判定条件:根据配额使用率判断是否需要触发回滚。
- 租户标识生成:根据全局配置生成租户唯一标识。
{{- /* _helpers.tpl */ -}}
{{- /* 生成资源全名 */ -}}
{{- define "tenant-quota-calibrator.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- /* 生成通用标签 */ -}}
{{- define "tenant-quota-calibrator.labels" -}}
helm.sh/chart: {{ include "tenant-quota-calibrator.fullname" . }}
{{ include "tenant-quota-calibrator.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{- /* 生成选择器标签 */ -}}
{{- define "tenant-quota-calibrator.selectorLabels" -}}
app.kubernetes.io/name: {{ include "tenant-quota-calibrator.fullname" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{- /* 计算配额使用率百分比 */ -}}
{{- define "tenant-quota-calibrator.quotaUsagePercent" -}}
{{- $used := .used -}}
{{- $limit := .limit -}}
{{- if gt $limit 0.0 -}}
{{- printf "%.2f" (div (mul $used 100.0) $limit) -}}
{{- else -}}
0.00
{{- end -}}
{{- end }}
{{- /* 判断是否需要触发回滚 */ -}}
{{- define "tenant-quota-calibrator.shouldRollback" -}}
{{- $usagePercent := include "tenant-quota-calibrator.quotaUsagePercent" . -}}
{{- $threshold := .Values.rollback.guardrail.thresholdViolationPercent -}}
{{- if gt (float64 $usagePercent) (float64 $threshold) -}}
true
{{- else -}}
false
{{- end -}}
{{- end }}
{{- /* 生成租户唯一标识 */ -}}
{{- define "tenant-quota-calibrator.tenantId" -}}
{{- printf "%s-%s" .Values.global.tenantId .Values.global.environment | lower | replace "_" "-" }}
{{- end }}
4.6 文件组织最佳实践
在租户配额校准场景中,建议遵循以下文件组织规范:
| 文件/目录 | 建议内容 | 配额校准相关文件示例 |
|---|---|---|
| templates/ | Kubernetes 资源模板 | quota-job.yaml, configmap.yaml, gateway-route.yaml |
| charts/ | 子 Chart 依赖 | common/(公共库 Chart) |
| crds/ | 自定义资源定义(CRD) | tenantquota.yaml(可选) |
| ci/ | CI 测试值文件 | ci/test-values.yaml |
| tests/ | Helm 测试模板 | test-connection.yaml |
核心原则:
- 单一职责:每个模板文件只生成一种 Kubernetes 资源类型。
- 配置与逻辑分离:
values.yaml只存放配置值,_helpers.tpl存放逻辑函数。 - 命名模板前缀统一:所有
define的函数使用 Chart 名称作为前缀,避免与其他 Chart 冲突。 - 敏感信息外部化:、密码等敏感信息通过 Secret 注入,不在模板中硬编码。