3. Helm Chart 基础:核心概念、目录结构、模板引擎与 Values 文件
在 Cilium 网络环境下的性能调优工程中,Helm 是管理 Kubernetes 资源声明与版本控制的核心工具。理解 Helm 的三大核心概念、标准目录布局、模板渲染机制以及 Values 文件的分层设计,是后续进行资源配额调整与性能参数注入的前提。本章将系统梳理这些基础要素,并建立 Helm 与 Cilium 配置之间的映射关系。
3.1 Helm 三大核心概念
Helm 围绕三个抽象层构建:Chart(包定义)、Release(运行实例)、Repository(分发仓库)。三者之间的关系决定了 Helm 如何管理应用生命周期。
| 概念 | 定义 | 在 Cilium 场景中的角色 |
|---|---|---|
| Chart | 一组描述 Kubernetes 资源的模板文件与元数据的集合,以压缩包形式分发。 | Cilium 官方 Chart 定义了 DaemonSet、ConfigMap、RBAC 等核心资源模板。 |
| Release | Chart 在目标集群中的一次部署实例,每个 Release 拥有独立的名称和版本历史。 | 同一集群可部署多个 Cilium Release(如 cilium-stable 与 cilium-canary),用于灰度验证性能参数。 |
| Repository | Chart 包的远程存储与索引服务,支持版本检索与依赖解析。 | Cilium 官方仓库 https://helm.cilium.io/ 提供所有稳定版与预览版 Chart。 |
3.2 Chart 目录结构标准
一个标准的 Helm Chart 目录结构遵循固定约定。Cilium 的 Chart 结构在此基础上增加了大量与 eBPF、网络策略、Hubble 相关的自定义文件。以下是最小化结构及各目录/文件的作用:
cilium/
├── Chart.yaml # 元数据:名称、版本、API 版本、依赖
├── values.yaml # 默认配置值,供模板引用
├── values.schema.json # (可选)Values 的 JSON Schema 校验文件
├── charts/ # 子 Chart 依赖(如 etcd-operator)
├── templates/ # Go 模板文件,渲染后生成 Kubernetes 资源
│ ├── _helpers.tpl # 模板辅助函数(命名、标签、选择器)
│ ├── daemonset.yaml # Cilium Agent DaemonSet
│ ├── deployment.yaml # Cilium Operator Deployment
│ ├── configmap.yaml # Cilium 配置(bpf、ipam、kube-proxy 替换)
│ ├── service.yaml # Hubble 与 Cilium API Service
│ ├── rbac.yaml # ClusterRole、ClusterRoleBinding
│ ├── psp.yaml # PodSecurityPolicy(已弃用但部分集群仍用)
│ └── NOTES.txt # 安装后的使用说明
└── crds/ # 自定义资源定义(CNP、CCNP、CEGP 等)
├── ciliumnetworkpolicies.yaml
└── ciliumclusterwidenetworkpolicies.yaml
- templates/:所有 YAML 资源文件必须放在此目录下,Helm 会递归渲染其中的
.yaml、.tpl、.txt文件。 - crds/:Cilium 的 CRD 文件放在此目录,Helm 会在安装时优先应用 CRD,确保自定义资源类型先于资源实例存在。
- charts/:Cilium 依赖的子 Chart(如 Hubble UI、etcd)在此目录以压缩包形式存放。
3.3 模板引擎与 Values 文件
Helm 使用 Go 模板引擎(text/template)将 Values 数据注入到模板文件中。模板语法包括指令、管道、变量和函数。Values 文件支持多层嵌套结构,Cilium 的 values.yaml 深度可达 5 层以上。
3.3.1 模板语法核心元素
| 语法 | 示例 | 说明 |
|---|---|---|
{{ .Values.key }} |
{{ .Values.global.clusterPoolIPv4PodCIDR }} |
引用 Values 中的值,支持点号路径。 |
{{- if condition -}} |
{{- if .Values.ipam.mode -}} |
条件判断,- 用于去除多余空白。 |
{{- range $i, $v := . -}} |
{{- range .Values.extraConfig -}} |
遍历列表或字典。 |
{{ .Values.key | default "fallback" }} |
{{ .Values.bpf.masquerade | default true }} |
管道函数,default 提供缺省值。 |
{{ include "helperName" . }} |
{{ include "cilium.fullname" . }} |
引用 _helpers.tpl 中定义的命名模板。 |
3.3.2 Values 文件分层与覆盖机制
Values 的最终值由多层文件合并决定,优先级从低到高为:Chart 内嵌 values.yaml → 依赖 Chart 的 values.yaml → 父 Chart 的 values.yaml → 用户提供的 --values 文件 → --set 命令行参数。在 Cilium 性能调优中,通常使用 --values 指定一个调优专用的 YAML 文件,避免修改 Chart 原始 values.yaml。
kubeProxyReplacement、ipam.mode)在安装后不可修改,必须通过 helm upgrade 重新部署。如果直接编辑 ConfigMap 而不更新 Release,Helm 会在下次升级时覆盖手动修改。始终通过 Values 文件驱动配置变更。
3.4 Helm 模板渲染与 Cilium 配置映射
以下 SVG 图展示了 Helm 模板引擎如何将 Values 文件中的性能参数注入到 Cilium Agent 的 DaemonSet 模板中,最终生成可部署的 Kubernetes 资源。
3.5 模板辅助函数与命名规范
_helpers.tpl 是模板复用的核心文件。Cilium 的 _helpers.tpl 定义了资源名称生成、通用标签、选择器表达式等函数。以下是最常用的辅助函数及其在性能调优中的用途:
| 辅助函数 | 输出示例 | 调优场景用途 |
|---|---|---|
cilium.fullname |
cilium-7x9k2 |
确保 DaemonSet Pod 名称唯一,便于日志聚合时按 Release 过滤。 |
cilium.labels |
app.kubernetes.io/name: cilium |
为资源添加统一标签,配合 Prometheus 选择器精确抓取指标。 |
cilium.selectorLabels |
app.kubernetes.io/instance: cilium |
Service 与 Pod 的匹配选择器,影响 Hubble 流量可视化准确性。 |
_helpers.tpl 中自定义标签(如 performance-profile: low-latency),然后在 Prometheus 的 relabel_configs 中利用该标签区分不同性能配置的 Cilium Agent 实例,实现指标隔离分析。
3.6 Helm 生命周期命令与 Release 管理
掌握以下命令是进行性能调优实验的基础。每个命令对应一个 Release 操作,直接影响集群中 Cilium 的运行状态。
# 安装 Cilium 并指定调优 Values 文件
helm install cilium cilium/cilium \
--namespace kube-system \
--values performance-tuning-values.yaml
# 升级 Release 以应用新的性能参数
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--values performance-tuning-values.yaml \
--reuse-values
# 查看当前 Release 的 Values 实际值(用于审计)
helm get values cilium --namespace kube-system
# 查看 Release 的模板渲染结果(调试用)
helm get manifest cilium --namespace kube-system | grep -A 20 "kind: DaemonSet"
# 回滚到上一个版本(性能回归时使用)
helm rollback cilium 1 --namespace kube-system
--reuse-values会保留之前手动--set的参数,如果调优过程中混合使用--values和--set,务必确认最终合并结果。- 回滚操作会触发 DaemonSet 滚动更新,导致 Cilium Agent 重启,期间网络策略可能短暂失效。建议在维护窗口执行。
- 使用
helm get manifest验证渲染后的 YAML 是否符合预期,特别是resources.requests和resources.limits字段是否被正确注入。