Helm包管理器使用指南

Helm包管理器使用指南

Helm包管理器使用指南

Helm是Kubernetes的包管理器,简化了Kubernetes应用的部署和管理。本文将介绍Helm的基本概念和使用方法。

Helm概述

什么是Helm?

Helm是一个用于管理Kubernetes应用的工具,它使用称为Chart的包格式,简化了Kubernetes应用的部署和管理。

核心概念:

  • Chart:Helm包,包含预配置的Kubernetes资源
  • Repository:Chart仓库,用于存储和共享Chart
  • Release:Chart的运行实例,在集群中部署的特定Chart版本

Helm的优势

  • 简化复杂应用部署:将多个Kubernetes资源打包为一个单元
  • 版本管理:跟踪和管理应用版本
  • 可重用性:共享和重用应用配置
  • 可配置性:通过values文件自定义部署
  • 升级和回滚:简化应用更新和恢复

Helm架构

Helm v3采用简化的架构:

  • Helm客户端:与Kubernetes API服务器交互的命令行工具
  • Chart:包含Kubernetes资源定义的包

Helm v3移除了之前版本中的Tiller服务器组件,提高了安全性和简化了架构。

安装Helm

使用脚本安装

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

使用包管理器安装

# MacOS
brew install helm

# Windows
choco install kubernetes-helm

# Linux (Snap)
sudo snap install helm --classic

验证安装

helm version

Helm基本命令

仓库管理

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

# 更新仓库
helm repo update

# 查看仓库列表
helm repo list

# 删除仓库
helm repo remove bitnami

搜索Chart

# 搜索Chart
helm search repo nginx

# 搜索Artifact Hub
helm search hub wordpress

安装Chart

# 安装Chart
helm install my-release bitnami/wordpress

# 使用自定义values文件安装
helm install my-release bitnami/wordpress -f values.yaml

# 设置特定值
helm install my-release bitnami/wordpress --set wordpressUsername=admin

管理Release

# 列出所有Release
helm list

# 查看Release状态
helm status my-release

# 升级Release
helm upgrade my-release bitnami/wordpress --set replicaCount=2

# 回滚Release
helm rollback my-release 1

# 卸载Release
helm uninstall my-release

创建自定义Chart

创建Chart骨架

helm create mychart

这将创建以下目录结构:

mychart/
  ├── .helmignore   # 指定忽略的文件模式
  ├── Chart.yaml    # Chart元数据
  ├── values.yaml   # 默认配置值
  ├── charts/       # 依赖Chart
  └── templates/    # 模板文件
      ├── NOTES.txt # 安装说明
      ├── _helpers.tpl # 模板辅助函数
      ├── deployment.yaml
      ├── service.yaml
      └── ...

Chart.yaml文件

apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.0.0"

values.yaml文件

replicaCount: 1

image:
  repository: nginx
  tag: stable
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80

模板示例

# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "mychart.fullname" . }}
  labels:
    {{- include "mychart.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      {{- include "mychart.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "mychart.selectorLabels" . | nindent 8 }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
              protocol: TCP

测试Chart

# 验证Chart语法
helm lint mychart

# 渲染模板但不安装
helm template mychart

# 本地安装测试
helm install test-release mychart --dry-run

# 安装Chart
helm install my-release ./mychart

Helm模板语法

Helm使用Go模板语言,并添加了一些特定功能。

基本语法

# 变量引用
{{ .Values.replicaCount }}

# 条件语句
{{- if .Values.enabled }}
# ...
{{- end }}

# 循环
{{- range .Values.configFiles }}
# ...
{{- end }}

# 管道
{{ .Values.name | upper | quote }}

内置函数

# 字符串操作
{{ .Values.name | upper }}  # 转为大写
{{ .Values.name | quote }}  # 添加引号

# 默认值
{{ .Values.port | default 80 }}

# 缩进
{{ .Values.data | nindent 4 }}

命名模板(部分)

# 定义模板
{{- define "mychart.labels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end -}}

# 使用模板
labels:
  {{- include "mychart.labels" . | nindent 4 }}

依赖管理

添加依赖

Chart.yaml中定义依赖:

dependencies:
  - name: mysql
    version: 8.8.3
    repository: https://charts.bitnami.com/bitnami
    condition: mysql.enabled

管理依赖

# 更新依赖
helm dependency update mychart

# 构建依赖
helm dependency build mychart

Helm Hooks

Helm钩子允许在Release生命周期的特定点执行操作。

常用钩子

  • pre-install:安装前执行
  • post-install:安装后执行
  • pre-upgrade:升级前执行
  • post-upgrade:升级后执行
  • pre-delete:删除前执行
  • post-delete:删除后执行

钩子示例

apiVersion: batch/v1
kind: Job
metadata:
  name: {{ .Release.Name }}-pre-install-job
  annotations:
    "helm.sh/hook": pre-install
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  template:
    spec:
      containers:
      - name: pre-install-job
        image: busybox
        command: ["/bin/sh", "-c", "echo Pre-Install Job"]
      restartPolicy: Never

Helm最佳实践

  1. 版本控制Chart

    • 将Chart存储在Git仓库中
    • 每次更改时更新版本号
  2. 使用values.yaml进行配置

    • 提供合理的默认值
    • 记录每个配置选项
  3. 编写清晰的文档

    • 在README.md中说明Chart的用途和配置
    • 在NOTES.txt中提供安装后指导
  4. 使用子Chart组织复杂应用

    • 将大型应用拆分为多个子Chart
    • 使用全局值共享配置
  5. 测试Chart

    • 使用helm lint验证语法
    • 使用helm template检查渲染结果
    • 创建测试钩子验证部署
  6. 安全最佳实践

    • 避免在模板中硬编码敏感信息
    • 使用Kubernetes Secrets存储敏感数据
    • 限制RBAC权限
  7. 优化Chart大小

    • 使用.helmignore排除不必要的文件
    • 避免包含大型二进制文件

常见问题排查

安装失败

# 查看失败原因
helm history my-release

# 查看详细状态
helm status my-release

# 使用调试模式
helm install my-release ./mychart --debug

模板渲染问题

# 查看渲染后的模板
helm template ./mychart --debug

# 验证特定值
helm template ./mychart --set service.type=NodePort

依赖问题

# 检查依赖状态
helm dependency list ./mychart

# 强制更新依赖
helm dependency update ./mychart --skip-refresh