Skip to content

02 - Helm:K8s 的包管理器

为什么需要 Helm?

一个应用可能有几十个 YAML 文件(Deployment、Service、ConfigMap、Secret、Ingress...),管理起来很痛苦:

  • 不同环境需要不同配置
  • 版本管理困难
  • 复用性差

Helm 就是 K8s 的 "apt/brew"——用 Chart(包)统一管理应用。


核心概念

概念说明
Chart一组 K8s 资源的模板包(类似 brew formula)
ReleaseChart 的一次安装实例
RepositoryChart 仓库
ValuesChart 的配置参数

安装 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        # 安装后提示
└── .helmignore

Chart.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

下一步

Phase 11 - 阿里云 ACK 与分布式训练