Skip to content

Helm 入门系列 04:动手实战——从零打造你的第一个 Helm Chart

约 1912 字大约 6 分钟

Helm 入门系列云原生Helm

2026-03-31

如果你已经了解了 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 anvil

2. 先看懂目录结构

生成的 anvil 目录里,每个文件/文件夹都有明确作用,先认清楚:

目录/文件通俗解释
Chart.yamlChart 的“身份证”:记录名称、版本、作者等元数据
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.yamlvalues.yamltemplates/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 ./anvil

2. 常用打包参数(按需用)

参数通俗作用
-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.tgz

2. 看懂校验结果

校验结果分 3 级,帮你区分问题严重程度:

  • INFO(信息):只是提示(比如少了图标),不影响安装;
  • WARN(警告):潜在风险(比如没配资源限制),默认不影响,但生产环境要注意;
  • ERROR(错误):严重问题(比如 YAML 语法错),Chart 装不了,必须修复。

3. 自动化校验(CI/CD 必备)

helm lint 有退出码:0 表示通过,非 0 表示失败。可以集成到 GitHub Actions、Jenkins 等 CI/CD 工具里,作为“质量门禁”——校验失败就不让打包/部署,保证 Chart 质量。

六、总结:这篇实战你学会了什么?

  1. helm create 快速生成 Chart 脚手架,不用从零写文件;
  2. 核心文件作用:Chart.yaml 记元数据,values.yaml 管配置,templates/ 存 K8s 模板;
  3. 改造模板和配置,让 Chart 适配自己的应用;
  4. helm package 打包分发,helm lint 提前校验问题。

到这里,你已经能独立做出一个可运行的 Chart 了!