Helm使用详解

一、Helm 简介

Helm 是 Kubernetes 的包管理工具,类比 Linux 中的 yumapt,用于简化应用的打包、部署和版本管理。其核心功能包括:

  • Chart 管理:将 Kubernetes 资源(Deployment、Service 等)打包为可复用的 Chart。
  • 动态配置:通过模板化 YAML 文件支持参数注入。
  • 版本控制:支持应用的升级、回滚及历史版本追踪。

二、Helm 安装与初始化

1. 安装 Helm 客户端
# 下载安装脚本并执行(适用于 Linux/macOS)
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

手动安装

  • Helm 官网 下载二进制文件,解压后移动至 /usr/local/bin
2. 添加仓库
# 添加官方仓库
helm repo add stable https://charts.helm.sh/stable
# 添加阿里云仓库(国内加速)
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 更新仓库索引
helm repo update

三、核心概念解析

概念 说明
Chart 应用包,包含部署所需的所有资源模板和配置(如 values.yaml)。
Repository Chart 仓库,类似 Docker Registry,存储可共享的 Chart。
Release Chart 在集群中的运行实例,每次安装生成唯一 Release。

四、Helm 使用详解

 1. Chart 操作
  • 搜索 Chart:
helm search repo nginx      # 从本地仓库搜索
helm search hub mysql      # 从 Artifact Hub 搜索公共 Chart
  • 安装 Chart
helm install my-nginx bitnami/nginx \
  --namespace dev \
  --set replicaCount=2 \
  -f custom-values.yaml
  • --set:动态覆盖配置参数。
  • -f:指定自定义 values.yaml 文件。
  • 查看已安装 Release
helm list -n dev           # 查看指定命名空间的 Release
helm status my-nginx       # 查看 Release 状态
2. Chart 开发
  • 创建新 Chart:
helm create myapp          # 生成 Chart 目录结构

  目录结构

myapp/
├── Chart.yaml            # Chart 元数据(名称、版本等)
├── values.yaml           # 默认配置参数
├── templates/            # Kubernetes 资源模板(Deployment、Service 等)
└── charts/               # 子 Chart 依赖
————————————————
  • 打包与发布
helm package myapp        # 生成 .tgz 包
helm push myapp-1.0.0.tgz repo-url  # 上传至私有仓库(需配置)
3. 升级与回滚
  • 升级 Release:
helm upgrade my-nginx bitnami/nginx --version 1.2.0
  • 回滚到历史版本
helm history my-nginx     # 查看版本历史
helm rollback my-nginx 2  # 回滚到版本 2
4. 卸载 Release
helm uninstall my-nginx -n dev

五、高级操作

1. 依赖管理

Chart.yaml 中定义依赖:

dependencies:
  - name: mysql
    version: 8.0.0
    repository: https://charts.bitnami.com/bitnami

运行 helm dependency update 下载依赖。

2. 模板函数与流程控制

templates/ 中使用 Go 模板语言动态生成配置:

# 示例:根据环境注入不同标签
metadata:
  labels:
    env: {{ .Values.environment | default "prod" }}

六、常见问题与注意事项

  1. 权限问题:确保 Helm 客户端有足够的 Kubernetes 集群权限。
  2. 网络问题:国内访问官方仓库可能需替换为镜像源(如阿里云)。
  3. 版本兼容性:Helm v3 移除 Tiller 组件,直接通过 kubeconfig 连接集群。

七、典型应用场景

  1. 微服务部署:一键部署包含数十个服务的复杂应用。
  2. 环境差异化配置:通过 values.yaml 区分开发、测试、生产环境。
  3. CI/CD 集成:在流水线中自动执行 helm upgrade

八、Helm 实践

以nginx为例创建一个Helm Chart并部署。

创建Chart样板

以nginx-chart命名

helm create nginx-chart

tree命令查看生成的文件夹,标准的Helm Chart结构。

nginx-chart/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

修改Chart.yaml文件

apiVersion: v2  # 图表 API 版本。v2 用于 Helm 3,v1 用于以前的版本。
name: nginx-chart  # Chart名称
description: My First Helm Chart # Chart描述
type: application #Chart类型可以是“应用程序”或“库”。应用程序图表是 Kubernetes 上部署的内容。库图表是可重复使用的图表,可与其他图表一起使用。编程中类似的库概念。
version: 0.1.0 # Chart版本
appVersion: "1.0.0" # 应用程序(Nginx)的版本号。每次对应用程序进行更改时,version appVersion 应该递增。
maintainers:
- email: contact@devopscube.com
  name: devopscube

修改templates

修改templates文件夹中的应用部署文件,默认生成的文件都十分复杂,需要配置大量value,往往不是项目需要的;因此可以全部删掉,按照需求自己写各种部署文件。

以下为deployment文件写法:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: "nginx:1.16.0"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
              protocol: TCP

上面的 YAML 文件,则值是静态的。helm chart 的想法是将 YAML 文件模板化,以便我们可以通过动态地为它们分配值来在多个环境中重用它们。

要对值进行模板化,只需在大括号内添加 object 参数,如下所示。它被称为模板指令,语法特定于 Go 模板

{{ .Object.Parameter }}

object包括三种:

  • Release 发布:每个 helm 图表都将使用发布名称进行部署。如果要使用发布名称或访问模板中与发布相关的动态值,可以使用发布对象。
  • Chart 图表:如果要使用 chart.yaml 中提到的任何值,可以使用图表对象。
  • Value 值values.yaml 文件中的所有参数都可以使用 Values 对象进行访问。

helm 模板指令替换工作流

针对nginx的deployment文件,选择名称、副本、容器名称、图像和 imagePullPolicy动态加载。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-nginx
  labels:
    app: nginx
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
              protocol: TCP

service.yaml同样配置设置。

apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}-service
spec:
  selector:
    app: nginx
  type: {{ .Values.service.type }}
  ports:
    - protocol: {{ .Values.service.protocol | default "TCP" }}
      port: {{ .Values.service.port }}
      targetPort: {{ .Values.service.targetPort }}

协议模板指令中,可以看到一个管道。它用于将协议的默认值定义为 TCP。因此,这意味着我们不会在 values.yaml 文件中定义协议值,或者如果它为空,它将采用 TCP 作为协议的值。( | )

配置values.yaml

接下来配置values.yaml文件,补充deployment.yaml和service.yaml文件中的.Value参数。

replicaCount: 2
 
image:
  repository: nginx
  tag: "1.16.0"
  pullPolicy: IfNotPresent
 
service:
  type: ClusterIP
  port: 9000
  targetPort: 80
 
env:
  name: dev

至此所有文件编辑完成。

验证Helm Chart

为了确保Chart有效并且所有缩进都很好,可以运行以下命令。确保位于Chart目录中。

helm lint .

输出结果如下即可

==> Linting .
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, 0 chart(s) failed

部署Helm Chart

部署Chart时,Helm 将从文件中读取图表和配置值,并生成清单文件。然后它会将这些文件发送到 Kubernetes API 服务器,Kubernetes 将在集群中创建请求的资源。

helm install frontend nginx-chart

2、上传至私有仓库拉取部署

helm package nginx-chart #打包chart
helm push nginx-chart-0.1.0.tgz oci://private.yd-data.com/helm-charts #推送至私有仓库

helm install my-nginx oci://private.yd-data.com/helm-charts/nginx-chart --version 0.1.0  #拉取私有仓库安装

frontend即部署的Release Name。

部署后输出以下内容:

NAME: frontend
LAST DEPLOYED: Tue May 13 03:23:21 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

使用helm list可以查看部署的helm。

通过查看deployment、service可以确认应用和服务运行。

Helm升级和回滚

修改任何配置后,升级Helm应用,只需要执行

helm upgrade frontend nginx-chart

以下为输出结果,Revision值为2

Release "frontend" has been upgraded. Happy Helming!
NAME: frontend
LAST DEPLOYED: Tue May 13 03:28:28 2025
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None

回滚可以使用rollback命令

helm rollback <release-name> <revision-number>

Helm Chart打包

helm package nginx-chart

查看本地文件可发现生成的nginx-chart-0.1.0.tgz文件

posted @ 2025-06-17 16:47  追梦$少年  阅读(182)  评论(0)    收藏  举报