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 数据直接存储在集群内,而非依赖第三方存储后端。
Helm 架构交互流程 Helm v3 架构交互流程 Helm Client helm install / upgrade Chart 仓库 Chart 包索引 Kubernetes API 创建/更新/删除资源 Helm Storage Release 历史 / Manifest 目标命名空间 Pod / Service / ConfigMap helm repo update 渲染后的 YAML 存储 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+ 字符串、数学、类型转换函数)。模板引擎的工作流程分为三步:

  1. 值注入:将 values.yaml、用户通过 --set 或 -f 传入的值合并为最终 Values 对象。
  2. 模板渲染:遍历 templates/ 目录下的每个 .yaml / .tpl 文件,执行 {{ .Values.xxx }} 等模板指令。
  3. 管道输出:将渲染后的 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
Release 版本演进与回滚流程 Release 版本演进与回滚流程 Rev 1 deployed Rev 2 deployed Rev 3 failed Rev 4 deployed helm rollback my-release 2 关键行为说明: • 回滚不会删除 Rev 3,而是创建 Rev 4 并复用 Rev 2 的 Manifest。 • 默认 Helm 保留最近 10 个 Revision,可通过 --history-max 调整。

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,确认所有配额字段已正确注入。这是排查“配置未生效”类问题的第一步。