Helm 从 0 开始制作一个 Helm Charts

举报
William 发表于 2025/07/15 09:17:34 2025/07/15
【摘要】 Helm 从 0 开始制作一个 Helm Charts​​1. 引言​​在云原生应用部署中,Kubernetes 的 YAML 文件管理逐渐暴露出复杂性高、重复性强的痛点。Helm 作为 Kubernetes 的包管理工具,通过 ​​Charts​​ 的抽象机制,实现了应用配置的模板化与版本化。本文将从零开始,手把手教你构建一个完整的 Helm Chart,涵盖从设计到部署的全流程,帮助开发...

Helm 从 0 开始制作一个 Helm Charts


​1. 引言​

在云原生应用部署中,Kubernetes 的 YAML 文件管理逐渐暴露出复杂性高、重复性强的痛点。Helm 作为 Kubernetes 的包管理工具,通过 ​​Charts​​ 的抽象机制,实现了应用配置的模板化与版本化。本文将从零开始,手把手教你构建一个完整的 Helm Chart,涵盖从设计到部署的全流程,帮助开发者高效管理 Kubernetes 应用。


​2. 技术背景​

​2.1 Helm 的核心价值​

  • ​模板化配置​​:通过 Go 模板语言动态生成 Kubernetes YAML,实现参数化部署。
  • ​版本控制​​:支持 Charts 的版本管理与依赖管理(依赖其他 Charts)。
  • ​生态整合​​:与 Helm Hub、Artifact Hub 等平台集成,提供预置应用仓库。

​2.2 Helm 核心组件​

组件 功能
​Chart​ 包含应用部署所需的所有 Kubernetes 资源模板和配置的目录结构。
​Repository​ 存储和分发 Charts 的仓库(如 Helm Hub)。
​Release​ 在 Kubernetes 集群中部署的 Chart 实例,每个 Release 有独立配置和状态。

​2.3 技术挑战​

  • ​模板语法复杂性​​:Go 模板的逻辑控制(如 ifrange)需要熟悉。
  • ​依赖管理​​:多 Charts 间的版本兼容性需谨慎处理。
  • ​调试困难​​:模板渲染错误可能导致 Kubernetes 资源创建失败。

​3. 应用使用场景​

​3.1 场景1:微服务应用部署​

  • ​目标​​:将包含多个微服务的应用(如前端+后端+数据库)打包为一个 Chart。

​3.2 场景2:中间件部署​

  • ​目标​​:快速部署 Redis、MySQL 等有状态服务,支持自定义存储和副本数。

​3.3 场景3:多环境配置​

  • ​目标​​:通过同一份 Chart 实现开发、测试、生产环境的差异化配置(如资源配额)。

​4. 不同场景下详细代码实现​

​4.1 环境准备​

​4.1.1 工具链安装​

# 安装 Helm (v3+)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 验证安装
helm version --short
# 输出示例: v3.12.0+ge9b0a4e

​4.1.2 创建初始 Chart​

# 在目标目录生成 Chart 骨架
helm create my-app-chart
cd my-app-chart
tree  # 查看生成的目录结构

生成的目录结构:

my-app-chart/
├── Chart.yaml          # Chart 元数据(版本、描述等)
├── values.yaml         # 默认配置参数
├── charts/             # 依赖的子 Charts
├── templates/          # Kubernetes 资源模板
│   ├── deployment.yaml
│   ├── service.yaml
│   └── _helpers.tpl    # 模板辅助函数
└── README.md           # Chart 使用说明

​4.2 场景1:微服务应用部署​

​4.2.1 修改 values.yaml 定义多服务配置​

# 文件: values.yaml
frontend:
  replicaCount: 2
  image:
    repository: nginx
    tag: "1.25"
    pullPolicy: IfNotPresent

backend:
  replicaCount: 3
  image:
    repository: my-registry/backend
    tag: "v1.0"
    pullPolicy: Always

service:
  type: ClusterIP
  port: 80

​4.2.2 动态生成多 Deployment 模板​

# 文件: templates/frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-frontend
spec:
  replicas: {{ .Values.frontend.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Release.Name }}-frontend
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}-frontend
    spec:
      containers:
      - name: nginx
        image: "{{ .Values.frontend.image.repository }}:{{ .Values.frontend.image.tag }}"
        ports:
        - containerPort: 80

---
# 文件: templates/backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-backend
spec:
  replicas: {{ .Values.backend.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Release.Name }}-backend
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}-backend
    spec:
      containers:
      - name: backend
        image: "{{ .Values.backend.image.repository }}:{{ .Values.backend.image.tag }}"
        ports:
        - containerPort: 8080

​4.2.3 统一 Service 暴露多服务​

# 文件: templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}-service
spec:
  type: {{ .Values.service.type }}
  ports:
  - port: {{ .Values.service.port }}
    targetPort: 80  # 默认前端端口,实际需根据服务调整
  selector:
    app: {{ .Release.Name }}-frontend  # 需扩展为多服务选择器

​优化点​​:需通过 endpointsIngress 实现多服务暴露(此处简化示例)。


​4.3 场景2:中间件部署(以 Redis 为例)​

​4.3.1 添加 Redis 依赖​

# 在 Chart 目录下添加依赖
helm dependency add my-app-chart bitnami/redis

生成的 charts/ 目录会包含 Redis 的子 Chart。

​4.3.2 覆盖 Redis 默认配置​

# 文件: values.yaml
redis:
  architecture: standalone  # 单节点模式
  auth:
    enabled: true
    password: "mysecretpassword"
  master:
    persistence:
      enabled: true
      size: 8Gi

​4.3.3 部署时注入配置​

helm install my-redis-release ./my-app-chart \
  --set redis.auth.password="newpassword"  # 覆盖密码

​5. 原理解释与原理流程图​

​5.1 Helm Charts 工作流程图​

[用户修改 values.yaml]
  → [Helm 解析模板]
    → [渲染 Kubernetes YAML]
      → [kubectl apply 到集群]
        → [生成 Release 记录]

​5.2 核心特性​

  • ​模板化渲染​​:通过 {{ .Values.xxx }} 动态注入配置。
  • ​依赖管理​​:requirements.yamlhelm dependency 管理子 Charts。
  • ​版本回滚​​:helm rollback <release> <version> 快速恢复历史版本。

​6. 环境准备与部署​

​6.1 生产环境最佳实践​

  • ​使用 Helmfile​​:通过 helmfile.yaml 批量管理多 Charts 部署。
  • ​集成 CI/CD​​:在 GitLab CI 或 ArgoCD 中实现 Helm 自动化部署。
  • ​安全加固​​:通过 helm-secrets 插件加密敏感配置。

​7. 运行结果​

​7.1 测试用例1:微服务部署​

# 安装 Chart
helm install my-app ./my-app-chart

# 验证资源创建
kubectl get pods -l app=my-app-frontend  # 应看到 2 个副本
kubectl get pods -l app=my-app-backend   # 应看到 3 个副本

​7.2 测试用例2:Redis 中间件​

# 安装带 Redis 的 Chart
helm install my-redis ./my-app-chart

# 验证 Redis 状态
kubectl exec -it $(kubectl get pods -l app.kubernetes.io/name=redis -o jsonpath='{.items[0].metadata.name}') -- redis-cli
# 输入 PING 应返回 PONG

​8. 测试步骤与详细代码​

​8.1 单元测试模板渲染​

# 使用 Helm 模板命令预览渲染结果
helm template my-app ./my-app-chart --values test-values.yaml > rendered.yaml

# 验证 YAML 语法
kubectl apply --dry-run=client -f rendered.yaml

​9. 部署场景​

​9.1 多环境部署策略​

# 文件: values-dev.yaml
replicaCount: 1
image:
  tag: "dev-latest"

# 文件: values-prod.yaml
replicaCount: 5
image:
  tag: "v1.0-stable"

​部署命令​​:

helm install my-app-dev ./my-app-chart -f values-dev.yaml  # 开发环境
helm install my-app-prod ./my-app-chart -f values-prod.yaml # 生产环境

​10. 疑难解答​

​常见问题1:模板渲染错误​

  • ​现象​​:Error: template: my-app-chart/templates/deployment.yaml:xx:xx: executing "xxx" at <.Values.xxx>: nil pointer evaluating interface {}.xxx
  • ​解决​​:检查 values.yaml 中是否遗漏必填字段,或使用 default 函数设置默认值:
    # 文件: templates/deployment.yaml
    replicas: {{ .Values.replicaCount | default 1 }}

​常见问题2:依赖 Chart 版本冲突​

  • ​现象​​:Error: found in Chart.yaml, but missing in charts/ directory
  • ​解决​​:运行 helm dependency update 更新子 Charts 到兼容版本。

​11. 未来展望与技术趋势​

​11.1 技术趋势​

  • ​Helm 3.12+ 新特性​​:支持 JSON Schema 校验 values.yaml
  • ​Kustomize 集成​​:与 Helm 结合实现更灵活的配置管理(如 helmify 工具)。

​11.2 挑战​

  • ​复杂状态管理​​:有状态服务(如数据库)的跨版本升级策略。
  • ​多集群部署​​:跨云厂商的 Helm Charts 统一管理。

​12. 总结​

本文从 Helm 的核心概念出发,通过微服务和中间件两个典型场景,演示了如何从零构建、测试和部署 Helm Charts。掌握 Helm 的模板化思想和依赖管理机制,可显著提升 Kubernetes 应用的交付效率。未来,随着云原生生态的演进,Helm 将在自动化、标准化和安全领域持续发力。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。