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 之间的完整协作关系:

Helm 核心概念与 Chart 结构关系图 Helm 核心概念与 Chart 结构关系图 Chart Repository 存储与分发 Chart 包 Chart 资源包(蓝图) Release 运行实例(房子) helm fetch / pull helm install / upgrade Values 配置参数(装修) Templates Go 模板(施工图) 子 Chart 依赖管理 注入参数 生成资源清单 依赖注入 子 Release 实例 核心流程说明: 1. 从 Repository 获取 Chart → 2. 结合 Values 渲染 Templates → 3. 生成 Kubernetes 资源清单 4. 通过 helm install 创建 Release → 5. 子 Chart 作为依赖自动部署为独立的子 Release

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 只需关注策略的渲染和部署,实现了关注点分离。