Helm 入门系列 04:动手实战——从零打造你的第一个 Helm Chart
如果你已经了解了 Helm 的基本概念,那接下来最核心的就是亲手打造一个属于自己的 Chart——毕竟 Helm 所有的部署、管理能力,都围绕 Chart 这个核心组件展开。
这篇文章会带着你从零开始,用 anvil 这个示例(无状态 HTTP 服务),一步步完成 Chart 的创建、改造、打包和校验,全程实战,看完就能上手。
一、先搞懂:Chart 到底是什么?
简单说,Chart 就是 Helm 对 Kubernetes 资源的“打包格式”——把 Deployment、Service 这些 K8s 配置文件,加上可配置的参数、元数据,整合成一个可复用、可分发的包。
你可以把它理解成:K8s 版的“安装包”(比如 Windows 的 exe、Linux 的 rpm),里面包含了应用部署的所有配置,还能通过参数灵活调整部署方式。
二、第一步:用一行命令生成基础 Chart
Helm 早就帮我们做好了“脚手架”,不用从零写文件。
1. 创建基础 Chart
执行下面的命令,就能在当前目录生成一个名为 anvil 的基础 Chart(默认以 Nginx 为模板):
helm create anvil2. 先看懂目录结构
生成的 anvil 目录里,每个文件/文件夹都有明确作用,先认清楚:
| 目录/文件 | 通俗解释 |
|---|---|
Chart.yaml | Chart 的“身份证”:记录名称、版本、作者等元数据 |
charts/ | 存放依赖的子 Chart(比如你的应用依赖 Redis Chart) |
templates/ | 核心!存放带“变量”的 K8s 配置模板(Deployment、Service 都在这) |
templates/NOTES.txt | 安装后显示的“使用指南”(比如告诉你怎么访问应用) |
values.yaml | 配置项清单:模板里的变量默认值都在这,安装时可自定义 |
3. 先跑起来试试(测试基础 Chart)
生成的 Chart 可以直接安装(默认部署 Nginx),验证结构没问题:
# 安装一个名为 myapp 的 anvil Chart 实例
helm install myapp ./anvil安装成功后,终端会输出 NOTES.txt 里的指南,跟着提示就能访问 Nginx 默认页面。
测试完记得卸载,避免占用资源:
helm uninstall myapp小提醒:如果你的 K8s 集群不能访问外网(Docker Hub),要先改
values.yaml里的镜像地址,换成集群能访问的仓库。
三、第二步:改造 Chart——适配你的应用(Anvil)
默认生成的 Chart 是给 Nginx 用的,我们要改成适配 Anvil(无状态服务,端口 80 提供 HTTP 服务),核心改 3 个文件:Chart.yaml、values.yaml、templates/deployment.yaml。
1. 改 Chart.yaml:完善“身份证”信息
Chart.yaml 是 Chart 的元数据文件,必需字段只有 3 个,但补充描述信息能让别人更容易理解你的 Chart。
基础版(必需)
apiVersion: v2 # Helm 3 推荐用 v2
name: anvil # Chart 名称(只能用小写、数字、-、.)
version: 0.1.0 # Chart 版本(遵循 主版本.次版本.补丁版本 格式)增强版(推荐)
加上这些字段,让 Chart 更“专业”:
apiVersion: v2
name: anvil
version: 0.1.0
appVersion: "1.0.0" # 应用本身的版本(不是 Chart 版本)
description: "一个简单的无状态服务,用于演示 Helm Chart 开发"
maintainers: # 维护者信息
- name: "你的名字"
email: "你的邮箱"
keywords: ["anvil", "无状态服务", "Helm 示例"]
type: application # 默认是应用 Chart,另一种是库 Chart(仅复用模板)2. 改 values.yaml:配置应用的默认参数
values.yaml 是 Chart 的“配置中心”,模板里的变量值都从这来,安装时还能通过 --set 覆盖。
针对 Anvil 改造后的核心配置(注释里是通俗解释):
# 1. 应用副本数(启动几个实例)
replicaCount: 1
# 2. 容器镜像配置(核心!换成 Anvil 镜像)
image:
repository: example/anvil # 替换成你的 Anvil 镜像地址(私有仓库/公有仓库)
pullPolicy: IfNotPresent # 拉取策略:本地有就不用重新拉
tag: "" # 镜像标签,空的话默认用 Chart.yaml 里的 appVersion
# 3. 服务暴露方式(默认集群内访问)
service:
type: ClusterIP # 可选:NodePort(节点端口)、LoadBalancer(云厂商负载均衡)
port: 80 # 服务端口,和 Anvil 容器端口一致
# 4. 资源限制(生产环境必配!防止应用占满集群资源)
resources:
limits: # 最大可用资源
cpu: 100m # 100 毫核(1 核 = 1000 毫核)
memory: 128Mi # 128MB 内存
requests: # 最小申请资源(K8s 调度时优先分配)
cpu: 100m
memory: 128Mi
# 5. 其他配置(Ingress、节点选择等,默认禁用即可)
ingress:
enabled: false
nodeSelector: {}
tolerations: []
affinity: {}3. 改 templates/deployment.yaml:适配应用部署规则
deployment.yaml 是定义 K8s 部署规则的模板,核心是改“容器镜像”部分(其他结构不用动):
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "anvil.fullname" . }} # 自动生成唯一名称(比如 myapp-anvil)
labels: {{ include "anvil.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }} # 引用 values.yaml 里的副本数
selector:
matchLabels: {{ include "anvil.selectorLabels" . | nindent 6 }}
template:
metadata:
labels: {{ include "anvil.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
# 引用 values.yaml 里的镜像配置,空标签就用 appVersion
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80 # Anvil 端口,不用改
protocol: TCP小技巧:
service.yaml不用改——默认端口也是 80,和 Anvil 匹配;_helpers.tpl是通用模板(生成名称、标签),遵循最佳实践,不用动。
四、第三步:打包 Chart——方便分发和部署
改造完成后,需要把 Chart 打包成 .tgz 格式的压缩包,方便分享、存储或部署。
1. 打包命令
# 把 anvil 目录打包成压缩包(当前目录生成 anvil-0.1.0.tgz)
helm package ./anvil2. 常用打包参数(按需用)
| 参数 | 通俗作用 |
|---|---|
-d ./packages | 指定压缩包输出到 packages 目录(默认当前目录) |
--version 0.1.1 | 临时覆盖 Chart 版本(比如紧急修复后改版本) |
--app-version 1.0.1 | 临时覆盖应用版本(只更应用,不更 Chart) |
3. 忽略无用文件(.helmignore)
和 Git 的 .gitignore 一样,.helmignore 用来指定打包时要跳过的文件(比如日志、编辑器配置),默认已经包含了常见的忽略项,你也可以加自己的规则(比如 logs/、temp/)。
4. 直接用打包文件部署
打包后的文件可以直接安装,不用再用目录:
helm install myanvil ./anvil-0.1.0.tgz五、第四步:校验 Chart——提前发现问题
开发过程中很容易写错 YAML 语法、模板逻辑,Helm 提供 helm lint 命令帮你自动检查,避免部署时踩坑。
1. 校验命令
# 校验 Chart 目录
helm lint ./anvil
# 校验打包后的压缩包
helm lint ./anvil-0.1.0.tgz2. 看懂校验结果
校验结果分 3 级,帮你区分问题严重程度:
- INFO(信息):只是提示(比如少了图标),不影响安装;
- WARN(警告):潜在风险(比如没配资源限制),默认不影响,但生产环境要注意;
- ERROR(错误):严重问题(比如 YAML 语法错),Chart 装不了,必须修复。
3. 自动化校验(CI/CD 必备)
helm lint 有退出码:0 表示通过,非 0 表示失败。可以集成到 GitHub Actions、Jenkins 等 CI/CD 工具里,作为“质量门禁”——校验失败就不让打包/部署,保证 Chart 质量。
六、总结:这篇实战你学会了什么?
- 用
helm create快速生成 Chart 脚手架,不用从零写文件; - 核心文件作用:
Chart.yaml记元数据,values.yaml管配置,templates/存 K8s 模板; - 改造模板和配置,让 Chart 适配自己的应用;
helm package打包分发,helm lint提前校验问题。
到这里,你已经能独立做出一个可运行的 Chart 了!
