Helm 从 0 开始制作一个 Helm Charts
【摘要】 Helm 从 0 开始制作一个 Helm Charts1. 引言在云原生应用部署中,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 模板的逻辑控制(如
if
、range
)需要熟悉。 - 依赖管理:多 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 # 需扩展为多服务选择器
优化点:需通过 endpoints
或 Ingress
实现多服务暴露(此处简化示例)。
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.yaml
或helm 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)