K8s 运维系列 | 第 15 天:应用打包——Helm 与 Chart 实战

引言

在前面十几天的学习中,我们已经掌握了 Kubernetes 的核心对象:Pod、Deployment、Service、ConfigMap、Secret、PV/PVC 等。随着要部署的应用越来越多,一个现实的问题摆在了我们面前:如果每个应用都要手写一大摞 YAML 文件,还要在开发、测试、生产环境之间反复修改镜像版本、副本数、资源配置,不仅效率低下,而且极易出错。有没有一种工具,能把一组 Kubernetes 资源打包成一个可复用、可参数化、可版本管理的”软件包”呢?答案就是 Helm——Kubernetes 生态中最流行的包管理器,被称为”K8s 世界的 apt/yum”。

K8s 运维 第15天

本篇文章,我们就从 Helm 的核心概念讲起,一步步带你完成 Chart 的编写、模板化、打包、安装与升级,真正把应用交付变成一件轻松可控的事情。

核心概念

什么是 Helm

Helm 是 CNCF 毕业项目,它的作用是把一个应用的整套 Kubernetes 资源(Deployment、Service、ConfigMap、Ingress 等)组织成一个 Chart(图表/包),并提供安装、升级、回滚、卸载等完整的生命周期管理能力。有了 Helm,部署一个完整的应用只需要一条命令:

helm install my-release ./my-chart

Chart、Release 与 Repository

  • Chart:应用的打包格式,本质是一个包含模板文件和元数据的目录,描述了一个应用需要哪些资源以及这些资源的默认配置。
  • Release:Chart 在集群中的一次安装实例。同一个 Chart 可以用不同配置安装出多个 Release,例如 dev-mysqlprod-mysql
  • Repository(仓库):存放 Chart 的服务器,类似于 Docker Registry 或 yum 源,例如官方的 artifacthub.io 与常见的 bitnami 仓库。
  • values.yaml:Chart 的参数文件,模板中的变量从这里取值,是”一次编写、多环境复用”的关键。

Helm 3 之后移除了服务端组件 Tiller,客户端直接通过 kubeconfig 与 API Server 交互,安全性大幅提升,也简化了部署。

实战步骤

1. 安装 Helm

以 Linux 环境为例,下载二进制并解压到 PATH:

curl -fsSL https://get.helm.sh/helm-v3.14.0-linux-amd64.tar.gz -o helm.tgz
tar -zxvf helm.tgz
sudo mv linux-amd64/helm /usr/local/bin/helm
helm version --short

输出类似 v3.14.0+g9fda02b 即表示安装成功。

2. 初始化仓库并搜索 Chart

# 添加 bitnami 官方仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# 搜索可用的 Chart
helm search repo nginx
helm search hub prometheus

helm search repo 只搜索本地已添加的仓库,helm search hub 则搜索整个 Artifact Hub。

3. 安装一个现成的 Chart

以 nginx 为例,安装并暴露服务:

helm install my-nginx bitnami/nginx 
  --set service.type=NodePort 
  --set replicaCount=2

安装完成后可以用下面的命令查看 Release 状态与资源:

helm list
helm status my-nginx
kubectl get pods

4. 创建并编写自己的 Chart

helm create 可以快速生成一个标准的 Chart 骨架:

helm create my-app
tree my-app

生成的目录结构如下:

my-app/
├── Chart.yaml          # Chart 元数据
├── values.yaml         # 默认配置参数
├── charts/             # 依赖的子 Chart
└── templates/          # 资源模板文件
    ├── deployment.yaml
    ├── service.yaml
    ├── hpa.yaml
    ├── ingress.yaml
    ├── serviceaccount.yaml
    ├── NOTES.txt
    └── _helpers.tpl    # 模板辅助函数

Chart.yaml 描述 Chart 的基本信息:

apiVersion: v2
name: my-app
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"

模板文件使用 Go 模板语法,可以从 values.yaml 中取值。例如 templates/deployment.yaml 中的副本数:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "my-app.fullname" . }}
  labels:
    {{- include "my-app.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "my-app.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "my-app.selectorLabels" . | nindent 8 }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          ports:
            - name: http
              containerPort: {{ .Values.service.port }}
              protocol: TCP

其中 {{ .Values.replicaCount }}{{ .Values.image.repository }} 都会在渲染时替换为 values.yaml 里的值。

5. 模板渲染与语法检查

在真正安装前,先用 helm template 查看渲染结果,用 helm lint 检查语法:

# 渲染模板并输出到控制台
helm template my-app ./my-app

# 语法与规范检查
helm lint ./my-app

# 使用自定义 values 覆盖默认值
helm template my-app ./my-app -f production.yaml

6. 安装、升级与回滚

# 安装
helm install my-app ./my-app --namespace default

# 升级(修改 values 或 Chart 后)
helm upgrade my-app ./my-app --set image.tag=1.17.0

# 查看历史版本
helm history my-app

# 回滚到上一个版本
helm rollback my-app 1

# 卸载
helm uninstall my-app

7. 打包与发布到仓库

把写好的 Chart 打成 .tgz 包,便于分发:

helm package ./my-app
# 生成 my-app-0.1.0.tgz

# 为仓库生成索引
helm repo index . --url https://charts.example.com

常见问题

1. 修改 values 后安装没有生效?

使用 helm upgrade 而不是重复 helm install,因为同名 Release 已存在时会报错。另外确认 values 层级写对,可用 helm get values my-app 查看当前生效的配置。

2. helm installrelease name already exists

Release 名称在 namespace 内唯一。可以换一个名字,或者先 helm uninstall 旧 Release,再重新安装。

3. 模板渲染结果不符合预期?

helm lint 检查语法,再用 helm template --debug 查看渲染过程与最终输出,定位是 values 覆盖问题还是模板逻辑问题。

4. 如何管理敏感配置?

不要在 values.yaml 中明文写密码,可以结合 Secret 与外部值文件,或使用 helm-secrets 插件对 values 文件加密。

总结

Helm 把 Kubernetes 的资源交付从”手写 YAML”提升为”包管理”,通过 Chart 模板化、values 参数化、Release 版本化,让应用在多环境之间快速、一致、可回滚地部署。本文我们从 Helm 的三大核心概念出发,完成了从安装、建 Chart、写模板、渲染校验到打包发布的完整闭环。

掌握了 Helm 之后,下一篇文章我们将继续深入工作负载的世界,讲解 StatefulSet、DaemonSet 与 Job 这三种高级控制器,看看有状态应用、守护进程和一次性任务在 Kubernetes 中是如何被优雅地管理的。

下期预告

第 16 天:工作负载进阶——StatefulSet、DaemonSet 与 Job,我们将详细拆解这三类控制器的使用场景、生命周期与实战案例,敬请期待!

微信二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容