Chapter 06

Chart 依赖管理

通过 dependencies 声明和 Umbrella Chart 模式,将复杂的多组件应用(Web + PostgreSQL + Redis)组合为一个可管理的整体进行部署。

Chart.yaml 中的 dependencies 声明

Chart.yamldependencies 字段声明当前 Chart 依赖的其他 Chart:

# Chart.yaml
apiVersion: v2
name: mywebapp
version: 0.1.0
appVersion: "1.0.0"

dependencies:
  - name: postgresql               # 子 Chart 名称
    version: ">=13.0.0 <14.0.0"   # SemVer 版本约束
    repository: https://charts.bitnami.com/bitnami
    condition: postgresql.enabled   # 条件字段:值为 false 时跳过

  - name: redis
    version: "18.x.x"
    repository: https://charts.bitnami.com/bitnami
    condition: redis.enabled
    alias: cache                    # 别名:允许同一 Chart 安装多次

  - name: common                   # library 类型的 Chart
    version: "2.x.x"
    repository: https://charts.bitnami.com/bitnami
    tags:                          # 标签组控制:启用/禁用一组依赖
      - monitoring

helm dependency update:下载依赖

# 下载所有声明的依赖到 charts/ 目录
helm dependency update ./mywebapp

# 更新后会生成/更新 Chart.lock 文件(锁定精确版本)
cat mywebapp/Chart.lock

# 列出依赖状态
helm dependency list ./mywebapp

# 如果 charts/ 中已有 .tgz 文件,可跳过下载
helm dependency build ./mywebapp  # 仅根据 Chart.lock 重建,不更新版本

# 查看 charts/ 目录(依赖以 .tgz 格式存储)
ls mywebapp/charts/
# postgresql-13.2.3.tgz   redis-18.1.0.tgz
Chart.lock 与版本锁定

Chart.lock 记录每个依赖的精确版本,类似 package-lock.json。生产部署建议将 Chart.lock 提交到 Git,确保 CI/CD 使用 helm dependency build(按锁定版本构建)而非 helm dependency update(可能升级版本)。

条件依赖:condition 与 tags

# Chart.yaml 中的依赖声明
dependencies:
  - name: postgresql
    version: "13.x.x"
    repository: https://charts.bitnami.com/bitnami
    condition: postgresql.enabled   # values 中 postgresql.enabled 为 false 则禁用
    tags:
      - database                   # 可通过 tags.database=false 批量禁用

  - name: prometheus
    version: "25.x.x"
    repository: https://prometheus-community.github.io/helm-charts
    condition: prometheus.enabled
    tags:
      - monitoring
# values.yaml 控制条件依赖
postgresql:
  enabled: true                   # condition 优先级高于 tags

prometheus:
  enabled: false                  # 禁用 prometheus

tags:
  database: true                  # 批量启用/禁用 database 标签下的依赖
  monitoring: false              # 批量禁用 monitoring 标签下的依赖

alias:同一 Chart 安装多次

# 使用别名:同一个 redis Chart 安装两个实例
dependencies:
  - name: redis
    version: "18.x.x"
    repository: https://charts.bitnami.com/bitnami
    alias: session-cache           # 第一个 Redis 实例:会话缓存

  - name: redis
    version: "18.x.x"
    repository: https://charts.bitnami.com/bitnami
    alias: job-queue              # 第二个 Redis 实例:任务队列
# 通过别名分别配置两个实例
session-cache:
  auth:
    enabled: true
    password: session-secret
  master:
    persistence:
      size: 2Gi

job-queue:
  auth:
    enabled: false
  master:
    persistence:
      size: 5Gi

Umbrella Chart:父 Chart 组合多个子 Chart

Umbrella Chart 是一种设计模式:创建一个纯粹用来组合其他 Chart 的父 Chart,本身没有 templates/,只有依赖声明和 values。

Umbrella Chart 架构

myplatform/               # Umbrella Chart(父)
├── Chart.yaml            # dependencies: [myapp, postgresql, redis, nginx-ingress]
├── values.yaml           # 所有子 Chart 的配置统一在此
└── charts/               # helm dep update 后下载的子 Chart
    ├── myapp-1.2.0.tgz   # 自有应用 Chart
    ├── postgresql-13.tgz # 数据库
    ├── redis-18.tgz      # 缓存
    └── ingress-nginx.tgz # 入口控制器

一条命令部署整套平台:
helm upgrade --install myplatform ./myplatform -f values-prod.yaml

实战:Web 应用 + PostgreSQL + Redis

# mywebapp/Chart.yaml
apiVersion: v2
name: mywebapp
version: 1.0.0
appVersion: "1.5.0"
description: Web application with PostgreSQL and Redis
dependencies:
  - name: postgresql
    version: "13.x.x"
    repository: https://charts.bitnami.com/bitnami
    condition: postgresql.enabled
  - name: redis
    version: "18.x.x"
    repository: https://charts.bitnami.com/bitnami
    condition: redis.enabled
# mywebapp/values.yaml

# 自有应用配置
replicaCount: 2
image:
  repository: myregistry.io/mywebapp
  tag: "1.5.0"

# PostgreSQL 子 Chart 配置
postgresql:
  enabled: true
  auth:
    database: mywebapp
    username: appuser
    password: changeme          # 生产中用 Secret
  primary:
    persistence:
      size: 8Gi

# Redis 子 Chart 配置
redis:
  enabled: true
  architecture: standalone      # 开发用单机模式
  auth:
    enabled: false
# 完整部署流程

# 1. 下载依赖
helm dependency update ./mywebapp

# 2. 验证模板渲染
helm template myapp ./mywebapp --debug

# 3. 部署到 staging
helm upgrade --install myapp-staging ./mywebapp \
  -f values-staging.yaml \
  --namespace staging --create-namespace

# 4. 查看所有已创建的资源
kubectl get all -n staging
helm status myapp-staging -n staging
charts/ 目录不要提交到 Git

charts/*.tgz 加入 .gitignore(或 .helmignore),只提交 Chart.yamlChart.lock。CI 流程中通过 helm dependency build 按锁定版本重建依赖。这样做既保持 Git 仓库整洁,又通过 Chart.lock 保证可重现性。

本章小结

Chart 依赖通过 Chart.yaml 的 dependencies 字段声明,helm dependency update 下载依赖为 .tgz 文件。condition 实现按需启用/禁用依赖,alias 允许同一 Chart 多实例,tags 批量控制一组依赖。Umbrella Chart 是大型系统的核心部署模式——创建一个只有依赖声明、无模板的父 Chart,一条命令部署整套平台。Chart.lock 类似 package-lock.json,应提交 Git 保证可重现性。