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最佳实践
-
版本控制Chart
- 将Chart存储在Git仓库中
- 每次更改时更新版本号
-
使用values.yaml进行配置
- 提供合理的默认值
- 记录每个配置选项
-
编写清晰的文档
- 在README.md中说明Chart的用途和配置
- 在NOTES.txt中提供安装后指导
-
使用子Chart组织复杂应用
- 将大型应用拆分为多个子Chart
- 使用全局值共享配置
-
测试Chart
- 使用
helm lint
验证语法 - 使用
helm template
检查渲染结果 - 创建测试钩子验证部署
- 使用
-
安全最佳实践
- 避免在模板中硬编码敏感信息
- 使用Kubernetes Secrets存储敏感数据
- 限制RBAC权限
-
优化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