Helm 包管理
概述
Helm 是 K8s 的包管理器,将 K8s 资源打包为 Chart,提供模板化、版本管理和发布功能。
核心概念
| 概念 | 说明 |
|---|---|
| Chart | 应用模板包(类似 npm 包) |
| Values | 可配置的参数(values.yaml) |
| Release | Chart 在集群中的一次安装实例 |
| Repository | Chart 仓库(类似 npm registry) |
常用命令
# ===== 仓库管理 =====
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm repo list
helm search repo nginx
# ===== 安装 =====
helm install my-nginx bitnami/nginx # 安装
helm install my-nginx bitnami/nginx -f values.yaml # 自定义配置
helm install my-nginx bitnami/nginx --set service.type=NodePort
helm install my-nginx bitnami/nginx -n production # 指定 Namespace
# ===== 管理 =====
helm list # 查看已安装的 Release
helm status my-nginx # 查看 Release 状态
helm get values my-nginx # 查看 Release 配置
helm get manifest my-nginx # 查看生成的 K8s 资源
# ===== 更新 =====
helm upgrade my-nginx bitnami/nginx -f values.yaml
helm upgrade --install my-nginx bitnami/nginx # 不存在则安装
# ===== 回滚 =====
helm history my-nginx # 查看版本历史
helm rollback my-nginx 1 # 回滚到版本 1
# ===== 卸载 =====
helm uninstall my-nginx
Chart 结构
mychart/
├── Chart.yaml # Chart 元信息
├── values.yaml # 默认配置
├── charts/ # 依赖 Chart
├── templates/ # K8s 资源模板
│ ├── _helpers.tpl # 模板辅助函数
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── configmap.yaml
│ ├── hpa.yaml
│ └── NOTES.txt # 安装后提示信息
└── .helmignore
Chart.yaml
Chart.yaml
apiVersion: v2
name: mychart
description: My application Helm chart
type: application
version: 1.0.0 # Chart 版本
appVersion: "2.0.0" # 应用版本
dependencies:
- name: postgresql
version: "12.x.x"
repository: https://charts.bitnami.com/bitnami
condition: postgresql.enabled
values.yaml
values.yaml
replicaCount: 3
image:
repository: myapp
tag: "2.0.0"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
ingress:
enabled: true
className: nginx
hosts:
- host: app.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: app-tls
hosts:
- app.example.com
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
targetCPUUtilization: 70
postgresql:
enabled: true
auth:
database: mydb
模板示例
templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "mychart.fullname" . }}
labels:
{{- include "mychart.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
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:
- containerPort: 8080
resources:
{{- toYaml .Values.resources | nindent 12 }}
调试与验证
# 渲染模板但不安装(查看生成的 YAML)
helm template my-nginx bitnami/nginx -f values.yaml
# 试运行(验证但不安装)
helm install my-nginx bitnami/nginx --dry-run --debug
# 验证 Chart 格式
helm lint ./mychart
# 打包 Chart
helm package ./mychart
常用 Chart 推荐
| Chart | 用途 |
|---|---|
bitnami/nginx | Nginx Web 服务器 |
bitnami/postgresql | PostgreSQL 数据库 |
bitnami/redis | Redis 缓存 |
bitnami/mysql | MySQL 数据库 |
prometheus-community/kube-prometheus-stack | 监控全家桶 |
ingress-nginx/ingress-nginx | Nginx Ingress Controller |
jetstack/cert-manager | 证书自动管理 |
常见面试问题
Q1: Helm 2 和 Helm 3 的主要区别?
答案:
Helm 3 最大变化是移除了 Tiller(服务端组件):
- Helm 2:Client → Tiller(集群内)→ API Server
- Helm 3:Client → API Server(直接通信)
其他变化:Release 信息存储在 Secret(而非 ConfigMap),支持三方合并策略,Chart v2 API。
Q2: 如何管理 Helm 的环境差异配置?
答案:
# 多环境 values 文件
helm install myapp ./mychart \
-f values.yaml \ # 基础配置
-f values.prod.yaml \ # 生产配置(覆盖)
--set image.tag=v2.0.0 # 命令行覆盖
优先级:--set > -f values.prod.yaml > -f values.yaml > Chart 默认 values.yaml