02 - Helm:K8s 的包管理器
为什么需要 Helm?
一个应用可能有几十个 YAML 文件(Deployment、Service、ConfigMap、Secret、Ingress...),管理起来很痛苦:
- 不同环境需要不同配置
- 版本管理困难
- 复用性差
Helm 就是 K8s 的 "apt/brew"——用 Chart(包)统一管理应用。
核心概念
| 概念 | 说明 |
|---|---|
| Chart | 一组 K8s 资源的模板包(类似 brew formula) |
| Release | Chart 的一次安装实例 |
| Repository | Chart 仓库 |
| Values | Chart 的配置参数 |
安装 Helm
bash
# macOS
brew install helm
# 验证
helm version基本使用
仓库管理
bash
# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable https://charts.helm.sh/stable
# 更新仓库索引
helm repo update
# 搜索 Chart
helm search repo nginx
helm search repo redis
# 查看 Chart 信息
helm show chart bitnami/nginx
helm show values bitnami/nginx # 查看可配置参数安装 / 升级 / 卸载
bash
# 安装 Chart
helm install my-nginx bitnami/nginx
# 指定命名空间
helm install my-nginx bitnami/nginx -n web --create-namespace
# 自定义参数
helm install my-nginx bitnami/nginx \
--set replicaCount=3 \
--set service.type=NodePort
# 使用 values 文件
helm install my-nginx bitnami/nginx -f values.yaml
# 升级
helm upgrade my-nginx bitnami/nginx --set replicaCount=5
# 安装或升级
helm upgrade --install my-nginx bitnami/nginx -f values.yaml
# 回滚
helm rollback my-nginx 1 # 回滚到 revision 1
# 卸载
helm uninstall my-nginx
# 查看已安装的 Release
helm list
helm list -A # 所有命名空间
# 查看 Release 历史
helm history my-nginx创建自己的 Chart
bash
# 创建 Chart 骨架
helm create my-app
# 目录结构
my-app/
├── Chart.yaml # Chart 元信息
├── values.yaml # 默认配置
├── charts/ # 依赖 Chart
├── templates/ # K8s 资源模板
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # 模板辅助函数
│ ├── hpa.yaml
│ ├── serviceaccount.yaml
│ └── NOTES.txt # 安装后提示
└── .helmignoreChart.yaml
yaml
apiVersion: v2
name: my-app
description: My application Helm chart
type: application
version: 0.1.0 # Chart 版本
appVersion: "1.0.0" # 应用版本values.yaml
yaml
replicaCount: 3
image:
repository: myapp
tag: "1.0.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
ingress:
enabled: false
hosts:
- host: myapp.local
paths:
- path: /
pathType: Prefix
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
autoscaling:
enabled: false
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 50模板语法
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 }}"
ports:
- containerPort: {{ .Values.service.port }}
resources:
{{- toYaml .Values.resources | nindent 12 }}调试和测试
bash
# 渲染模板(不安装,只查看生成的 YAML)
helm template my-release ./my-app
# 检查语法
helm lint ./my-app
# 模拟安装
helm install my-release ./my-app --dry-run --debug
# 打包
helm package ./my-app
# 推送到仓库
helm push my-app-0.1.0.tgz oci://registry.example.com/charts多环境管理
my-app/
├── values.yaml # 默认值
├── values-dev.yaml # 开发环境覆盖
├── values-staging.yaml # 预发环境覆盖
└── values-prod.yaml # 生产环境覆盖bash
# 开发环境
helm upgrade --install my-app ./my-app -f values.yaml -f values-dev.yaml
# 生产环境
helm upgrade --install my-app ./my-app -f values.yaml -f values-prod.yaml