跳到主要内容

Helm 包管理

概述

Helm 是 K8s 的包管理器,将 K8s 资源打包为 Chart,提供模板化、版本管理和发布功能。

核心概念

概念说明
Chart应用模板包(类似 npm 包)
Values可配置的参数(values.yaml
ReleaseChart 在集群中的一次安装实例
RepositoryChart 仓库(类似 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/nginxNginx Web 服务器
bitnami/postgresqlPostgreSQL 数据库
bitnami/redisRedis 缓存
bitnami/mysqlMySQL 数据库
prometheus-community/kube-prometheus-stack监控全家桶
ingress-nginx/ingress-nginxNginx 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

相关链接