2. Helm 核心概念与 Chart 结构
在深入资源配额与网络拓扑协同调优之前,必须牢固掌握 Helm 的五大核心概念以及 Chart 的目录契约。这些概念是后续所有 Helm 操作的基石,也是理解资源模板化与依赖管理的起点。
2.1 五大核心概念
| 概念 | 定义 | 类比(类比 Kubernetes 对象) |
|---|---|---|
| Chart | 一个预配置的 Kubernetes 资源包,包含模板、默认值、依赖等。 | 类似于一个 Deployment 的 YAML 模板集合。 |
| Release | Chart 在 Kubernetes 集群中的一个运行实例。同一个 Chart 可以部署多次。 | 类似于一个 Pod 的特定运行实例。 |
| Repository | Chart 的存储和分发仓库,类似 Docker Registry。 | 类似于 Image Registry 用于存储容器镜像。 |
| Values | 用于覆盖 Chart 默认配置的键值对,实现参数化部署。 | 类似于 ConfigMap 或 Deployment 的环境变量。 |
| Templates | Go 模板文件,结合 Values 动态生成 Kubernetes 资源清单。 | 类似于 Kustomize 的 patches 或 vars。 |
关键区别: Chart 是“蓝图”,Release 是“房子”。同一个蓝图(Chart)可以盖出多栋房子(Release),每栋房子可以有不同的装修(Values)。
2.2 Chart 目录结构
一个标准的 Helm Chart 遵循固定的目录契约。以下是一个典型 Chart 的完整结构,包含子 Chart 依赖管理:
my-chart/
├── Chart.yaml # Chart 元数据(名称、版本、依赖等)
├── values.yaml # 默认配置值
├── values.schema.json # (可选)Values 的 JSON Schema 校验
├── charts/ # 子 Chart 依赖(手动放置或 helm dependency update 下载)
│ ├── sub-chart-a/
│ │ ├── Chart.yaml
│ │ ├── values.yaml
│ │ └── templates/
│ └── sub-chart-b/
│ ├── Chart.yaml
│ ├── values.yaml
│ └── templates/
├── templates/ # 核心模板目录
│ ├── _helpers.tpl # 模板辅助函数(命名模板)
│ ├── deployment.yaml # Deployment 模板
│ ├── service.yaml # Service 模板
│ ├── ingress.yaml # Ingress 模板
│ ├── hpa.yaml # HPA 模板(资源配额相关)
│ ├── pdb.yaml # PodDisruptionBudget 模板
│ ├── configmap.yaml # ConfigMap 模板
│ ├── secret.yaml # Secret 模板
│ ├── tests/ # 测试模板
│ │ └── test-connection.yaml
│ └── NOTES.txt # 安装后的使用说明
└── .helmignore # 打包时忽略的文件模式
常见陷阱: 不要将
charts/ 目录下的子 Chart 直接修改。子 Chart 应通过 Chart.yaml 的 dependencies 字段声明,然后使用 helm dependency update 管理。手动修改 charts/ 内的子 Chart 会导致依赖版本混乱。
2.3 子 Chart 依赖管理
子 Chart 依赖在 Chart.yaml 的 dependencies 字段中声明。Helm 支持三种依赖模式:
- 直接依赖: 子 Chart 被直接放置在
charts/目录下。 - 仓库依赖: 从 Chart Repository 下载。
- 本地路径依赖: 通过
file://路径引用本地 Chart。
以下是一个包含 Cilium 网络策略依赖的 Chart.yaml 示例:
apiVersion: v2
name: my-app
description: 一个包含网络策略依赖的示例应用
type: application
version: 1.0.0
appVersion: "1.0.0"
dependencies:
- name: cilium-network-policies
version: "0.1.0"
repository: "file://./charts/cilium-network-policies"
condition: cilium-network-policies.enabled
tags:
- network-policy
- name: redis
version: "17.0.0"
repository: "https://charts.bitnami.com/bitnami"
alias: cache-db
import-values:
- child: defaults
parent: redis-defaults
依赖管理最佳实践:
- 使用
condition字段控制子 Chart 的启用/禁用。 - 使用
tags字段对依赖进行分组管理。 - 使用
import-values将子 Chart 的 Values 导入到父 Chart 中,避免重复定义。 - 始终运行
helm dependency update生成Chart.lock文件,锁定依赖版本。
2.4 Values 与 Templates 的协同机制
Values 通过 values.yaml 提供默认值,Templates 通过 Go 模板语法引用这些值。以下是一个典型的资源配额模板示例:
{{- define "my-app.resources" -}}
resources:
requests:
memory: {{ .Values.resources.requests.memory | default "256Mi" | quote }}
cpu: {{ .Values.resources.requests.cpu | default "250m" | quote }}
limits:
memory: {{ .Values.resources.limits.memory | default "512Mi" | quote }}
cpu: {{ .Values.resources.limits.cpu | default "500m" | quote }}
{{- end -}}
对应的 values.yaml 配置:
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1"
在 deployment.yaml 中引用:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
spec:
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
{{- include "my-app.resources" . | nindent 10 }}
2.5 核心概念关系图
下图展示了 Chart、Release、Repository、Values、Templates 以及子 Chart 之间的完整协作关系:
2.6 子 Chart 依赖的 Values 覆盖优先级
当父 Chart 和子 Chart 存在同名 Values 时,Helm 遵循严格的优先级规则:
| 优先级 | 来源 | 示例 |
|---|---|---|
| 1(最高) | --set 命令行参数 |
--set sub-chart-a.replicas=5 |
| 2 | 父 Chart 的 values.yaml 中 子Chart名称 块 |
sub-chart-a: { replicas: 3 } |
| 3 | 子 Chart 自身的 values.yaml |
replicas: 1 |
| 4(最低) | 子 Chart 的 Chart.yaml 中的 default 值 |
通常不定义,使用模板默认值 |
实战建议: 在调优 Cilium 网络策略时,建议将网络策略相关的 Values 放在父 Chart 的
values.yaml 中,通过 import-values 或 export-values 传递给子 Chart,避免在多个地方重复定义,减少配置漂移风险。
2.7 子 Chart 依赖的常见模式
在资源配额与网络拓扑协同场景中,子 Chart 依赖通常采用以下三种模式:
- 基础设施依赖: 子 Chart 提供 CiliumNetworkPolicy、NetworkPolicy 等网络资源,父 Chart 引用这些策略。
- 中间件依赖: 子 Chart 提供 Redis、MySQL 等中间件,父 Chart 通过
import-values获取连接信息。 - 配置共享依赖: 子 Chart 提供全局 ConfigMap,父 Chart 和其他子 Chart 共享配置。
以下是一个使用 import-values 共享 Cilium 网络策略配置的示例:
# 父 Chart values.yaml
cilium-network-policies:
enabled: true
policies:
- name: allow-app-communication
ingress:
- fromEndpoints:
- matchLabels:
app: my-app-frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
# 父 Chart Chart.yaml 中的依赖声明
dependencies:
- name: cilium-network-policies
version: "0.1.0"
repository: "file://./charts/cilium-network-policies"
import-values:
- child: policies
parent: network-policies
通过这种方式,父 Chart 可以将网络策略配置统一管理,子 Chart 只需关注策略的渲染和部署,实现了关注点分离。