一、Helm 基本概念

Helm 是 Kubernetes 的包管理器,您可以将其类比为 Linux 系统中的 yum 或 apt,或者 Python 中的 pip。它的核心目标是简化 Kubernetes 应用的打包、分发、部署和生命周期管理

Helm 有三个核心概念:

1、Chart

  • 是什么:一个 Helm 软件包,包含了在 Kubernetes 上运行一个应用所需的所有资源定义。

  • 类比:类似于 apt 的 .deb 包 或 yum 的 .rpm 包。

  • 内容:它是一个目录的集合,里面包含了一系列 YAML 模板文件和一些默认配置。

  • 结构

mychart/
├── Chart.yaml          # Chart 自身的元信息,如名称、版本等
├── values.yaml         # 默认的配置参数
├── charts/             # 依赖的其他 Chart(子 Chart)
└── templates/          # 模板文件目录,包含 Deployment, Service, Ingress 等 Kubernetes 资源清单的模板
    ├── deployment.yaml
    ├── service.yaml
    └── ...

2、Release

  • 是什么:在 Kubernetes 集群中运行的 Chart 的一个实例

  • 类比:安装软件包后,在系统中运行的一个具体进程。

  • 解释:当你使用 helm install 安装一个 Chart 时,Helm 会结合你的配置参数,将 Chart 中的模板渲染成真正的 Kubernetes YAML 文件,并将其提交给 API Server,从而在集群中创建出具体的资源(如 Pod, Service 等)。这个被部署出来的应用就是一个 Release。同一个 Chart 可以被安装多次,每次安装都会生成一个独立的 Release。

3、Repository

  • 是什么:Chart 的存放仓库,用于存储和共享 Chart。

  • 类比:类似于 Docker Hub 或 Maven Central。

  • 作用:你可以从公共的或私有的 Repository 中查找、下载和上传 Chart。

二、Helm 的核心作用

1、简化复杂应用的部署

  • 一个微服务应用可能包含几十个 Kubernetes 资源(Deployment, Service, ConfigMap, Secret, Ingress 等)。手动管理这些 YAML 文件极其繁琐且容易出错。Helm 将它们打包成一个 Chart,实现一键部署。

2、管理应用依赖

  • Chart 可以声明依赖其他 Chart(例如,一个 Web 应用依赖 Redis 和 PostgreSQL)。Helm 会自动帮你下载和安装这些依赖。

3、版本化管理与升级回滚

  • Chart 本身有版本,Release 也有版本。你可以轻松地:

    • helm upgrade:升级应用到新版本。

    • helm rollback:回滚到之前的任何一个版本。

    • helm history:查看一个 Release 的发布历史。

4、参数化配置

  • 这是 Helm 最强大的特性之一。通过 Go 模板语言 和 values.yaml 文件,可以将配置与模板分离。

  • 模板化:在 templates/ 目录下的 YAML 文件中,使用 {{ .Values.parameter }} 的语法来引用变量。

  • 值文件:在 values.yaml 中为这些变量提供默认值。用户可以在安装时通过 -f custom-values.yaml 或 --set key=value 来覆盖这些默认值,实现一份模板,多处部署(如开发、测试、生产环境使用不同配置)。

三、Helm 配置详解(以 values.yaml 为例)

values.yaml 是 Helm Chart 的默认配置文件。它定义了所有可配置的参数。

一个典型的 values.yaml 示例:

# values.yaml

# 副本数
replicaCount: 2

# 镜像配置
image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "latest"

# 服务配置
service:
  type: ClusterIP
  port: 80

# 资源限制
resources:
  limits:
    cpu: 200m
    memory: 256Mi
  requests:
    cpu: 100m
    memory: 128Mi

# 自动扩缩容 (HPA) 配置
autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80

#  ingress 配置
ingress:
  enabled: false
  className: "nginx"
  hosts:
    - host: chart-example.local
      paths:
        - path: /
          pathType: Prefix

对应的模板文件 templates/deployment.yaml 片段:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-deployment
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: 80
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

如何使用自定义配置:

# 1. 使用自定义的 values 文件
helm install my-app ./my-chart -f production-values.yaml

# 2. 在命令行直接覆盖某个值
helm install my-app ./my-chart --set replicaCount=3 --set image.tag="v1.2.3"

# 3. 两者结合
helm install my-app ./my-chart -f production-values.yaml --set resources.limits.cpu=500m

四、经典案例:使用 Helm 部署 WordPress

这个案例完美展示了 Helm 如何管理一个复杂的、有状态的应用。

步骤:

1、添加 Bitnami 仓库(一个流行的 Helm 公共仓库)

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

2、查找并查看 WordPress Chart

helm search repo wordpress
helm show values bitnami/wordpress > my-values.yaml

3、定制化配置(编辑 my-values.yaml

# my-values.yaml
wordpressUsername: admin
wordpressPassword: "my-strong-password"
wordpressEmail: admin@example.com

# 使用外部数据库,而不是 Chart 内嵌的(生产环境推荐)
mariadb:
  enabled: false
externalDatabase:
  host: my-production-mysql
  user: wordpress
  password: "mysql-password"
  database: wordpress

# 配置持久化存储
persistence:
  enabled: true
  size: 20Gi

# 配置 Service 类型为 LoadBalancer,以便从外部访问
service:
  type: LoadBalancer

4、安装 WordPress

helm install my-wordpress bitnami/wordpress -f my-values.yaml
  • 这个命令会创建一个名为 my-wordpress 的 Release。

  • Helm 会根据 Chart 和你的 my-values.yaml,创建出包括 WordPress Pod、Service、PersistentVolumeClaim(如果需要)等在内的所有资源。

5、查看发布状态

helm list
helm status my-wordpress
kubectl get pods,svc,pvc

6、升级与回滚

# 升级:将 WordPress 镜像版本升级到指定版本
helm upgrade my-wordpress bitnami/wordpress -f my-values.yaml --set image.tag=6.2

# 查看历史
helm history my-wordpress

# 回滚:如果升级后出现问题,回滚到上一个版本
helm rollback my-wordpress 1

7、卸载

helm uninstall my-wordpress
# 注意:默认情况下,Helm 不会删除 PVC,以防止数据丢失。需要手动删除。

通过这个案例,你可以看到 Helm 如何将部署一个包含 Web 服务器和数据库的复杂应用,简化成几个简单的命令,并且能轻松地进行配置管理和版本控制。

总结

特性 解决的问题 核心命令
打包 管理大量分散的 YAML 文件 helm createhelm package
分发 共享和复用应用部署模板 helm repo add/updatehelm pull
部署 一键部署复杂应用 helm install
配置管理 环境差异化配置 -f values.yaml--set
生命周期管理 应用升级、回滚、卸载 helm upgradehelm rollbackhelm uninstall

Helm 是现代 Kubernetes 技术栈中不可或缺的一环,是实现 GitOps 和 应用交付自动化 的基石工具。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐