2. Helm 基础回顾:Helm 架构、Chart 结构、模板引擎、Release 管理
在深入 Cilium 网络拓扑的资源配额瓶颈分析之前,必须牢固掌握 Helm 的核心机制。Helm 是 Kubernetes 的包管理工具,它将应用定义、配置和依赖打包为 Chart,并通过模板引擎实现环境差异化部署。本节将系统回顾 Helm 的四大支柱:架构、Chart 结构、模板引擎与 Release 管理。
2.1 Helm 架构与核心组件
Helm 采用客户端-服务端(Client-Server)架构,由以下三个核心组件构成:
| 组件 | 名称 | 职责 | 部署位置 |
|---|---|---|---|
| Helm Client | helm CLI |
Chart 打包、仓库管理、Release 创建/升级/回滚 | 用户本地或 CI/CD 节点 |
| Helm Library | SDK | 模板渲染、Chart 验证、与 Kubernetes API 交互 | 嵌入在 Client 中 |
| Helm Storage | Secrets / ConfigMaps | 存储 Release 历史、渲染后的 Manifest、元数据 | Kubernetes 集群内(默认 kube-system 命名空间) |
架构演进说明: Helm v3 移除了服务端组件 Tiller,直接通过 Client 调用 Kubernetes API。这一变化消除了 Tiller 的权限安全风险,并使得 Release 数据直接存储在集群内,而非依赖第三方存储后端。
2.2 Chart 结构详解
一个标准的 Helm Chart 是一个遵循特定目录结构的文件集合。以 Cilium Chart 为例,其核心结构如下:
cilium/
├── Chart.yaml # Chart 元数据(名称、版本、API 版本、依赖)
├── values.yaml # 默认配置值(用户可覆盖)
├── values.schema.json # (可选)values 的 JSON Schema 校验
├── charts/ # 子 Chart 依赖(如 etcd-operator)
│ └── etcd-operator-0.1.0.tgz
├── templates/ # Go 模板文件目录
│ ├── _helpers.tpl # 模板辅助函数(命名模板)
│ ├── NOTES.txt # 安装后的使用说明
│ ├── daemonset.yaml # Cilium Agent DaemonSet
│ ├── deployment.yaml # Cilium Operator Deployment
│ ├── configmap.yaml # Cilium 配置
│ ├── serviceaccount.yaml # RBAC 资源
│ └── hpa.yaml # 水平自动扩缩容
└── crds/ # 自定义资源定义(CRD)
└── ciliumnetworkpolicies.yaml
关键目录说明:
templates/:所有 Kubernetes 资源清单的 Go 模板文件,Helm 会结合values.yaml渲染出最终 YAML。crds/:CRD 文件在helm install时优先安装,且 Helm 不会对 CRD 进行升级或删除,需手动管理。charts/:存放依赖的子 Chart,可通过helm dependency update拉取。
2.3 模板引擎核心机制
Helm 使用 Go 的 text/template 引擎,并扩展了 Sprig 函数库(提供 70+ 字符串、数学、类型转换函数)。模板引擎的工作流程分为三步:
- 值注入:将
values.yaml、用户通过--set或-f传入的值合并为最终 Values 对象。 - 模板渲染:遍历
templates/目录下的每个.yaml/.tpl文件,执行{{ .Values.xxx }}等模板指令。 - 管道输出:将渲染后的 YAML 发送给 Kubernetes API 或输出到标准输出(
helm template)。
以下是一个典型的 Cilium Agent DaemonSet 模板片段:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: {{ include "cilium.fullname" . }}-agent
labels:
app: {{ include "cilium.name" . }}
release: {{ .Release.Name }}
spec:
selector:
matchLabels:
app: {{ include "cilium.name" . }}
template:
metadata:
labels:
app: {{ include "cilium.name" . }}
k8s-app: cilium
spec:
containers:
- name: cilium-agent
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
args:
- --bpf-map-dynamic-size-ratio={{ .Values.bpf.mapDynamicSizeRatio }}
env:
- name: KUBERNETES_SERVICE_HOST
value: {{ .Values.global.k8sServiceHost | quote }}
模板引擎常见陷阱:
- 缩进问题:
template指令不会自动缩进,需使用indent函数(如{{ include "cilium.labels" . | indent 8 }})。 - 类型转换:
values.yaml中的数字默认是int,字符串需显式quote或toString。 - 作用域丢失:在
range或with块内,$代表根作用域,.代表当前作用域。
2.4 Release 管理生命周期
Release 是 Helm 管理的核心抽象,代表 Chart 的一次部署实例。每个 Release 都有唯一的名称、版本号和状态。以下是 Release 的完整生命周期:
| 阶段 | Helm 命令 | Release 状态 | 存储行为 |
|---|---|---|---|
| 安装 | helm install |
deployed |
创建第一个 Release 版本(Revision 1) |
| 升级 | helm upgrade |
deployed(新) / superseded(旧) |
创建新 Revision,旧版本标记为 superseded |
| 回滚 | helm rollback |
deployed(目标版本) / superseded(当前版本) |
将指定 Revision 重新部署,并创建新 Revision |
| 卸载 | helm uninstall |
uninstalled |
删除所有 Kubernetes 资源,保留 Release 记录(可指定 --keep-history) |
| 查看历史 | helm history |
列出所有 Revision 及状态 | 读取 Helm Storage 中的 Secrets |
2.5 与 Cilium 网络拓扑的关联
在后续章节中,我们将反复用到本节的知识点:
- Chart 结构:Cilium 的
values.yaml中定义了bpf.mapDynamicSizeRatio、ipam.mode、nodeinit.enabled等关键参数,这些参数直接影响 eBPF Map 的内存配额。 - 模板引擎:Cilium 的 DaemonSet 模板中通过
{{ .Values.resources.requests.memory }}注入资源配额,错误的模板语法会导致配额未生效。 - Release 管理:当 Cilium 网络拓扑变更(如新增节点、启用带宽管理)时,需要通过
helm upgrade调整资源配额,并利用helm rollback快速回退异常配置。
实践建议: 在分析 Cilium 资源配额瓶颈前,先使用
helm template cilium cilium/cilium --debug 查看渲染后的完整 YAML,确认所有配额字段已正确注入。这是排查“配置未生效”类问题的第一步。