专栏: 云原生 & DevOps
难度: 进阶
标签: Helm Kubernetes Chart 模板 应用打包


前言

手写一堆YAML维护很痛苦,Helm 就是 Kubernetes 的包管理器。本文从零开发一个完整 Helm Chart,掌握后可以直接用在生产。


一、Helm 基础概念

  • Chart:Helm 的包,包含一个应用的所有 Kubernetes 资源模板
  • Release:Chart 的一次部署实例
  • Repository:存储 Chart 的仓库
  • Values:部署时的配置参数,覆盖默认值

二、创建 Chart

# 创建Chart骨架
helm create myapp

# 目录结构
myapp/
├── Chart.yaml          # Chart元信息
├── values.yaml         # 默认配置值
├── charts/             # 依赖的子Chart
└── templates/          # 资源模板
    ├── deployment.yaml
    ├── service.yaml
    ├── ingress.yaml
    ├── _helpers.tpl    # 模板辅助函数
    ├── hpa.yaml
    └── NOTES.txt       # 部署后展示的说明

三、编写 values.yaml

# values.yaml
replicaCount: 2

image:
  repository: registry.example.com/myapp
  tag: "1.0.0"
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80
  targetPort: 8080

ingress:
  enabled: true
  host: myapp.example.com
  tlsEnabled: false

resources:
  limits:
    cpu: 1000m
    memory: 512Mi
  requests:
    cpu: 250m
    memory: 128Mi

autoscaling:
  enabled: false
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 70

env:
  DB_HOST: "db.example.com"
  LOG_LEVEL: "info"

四、编写 templates/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "myapp.fullname" . }}
  labels:
    {{- include "myapp.labels" . | nindent 4 }}
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  selector:
    matchLabels:
      {{- include "myapp.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      labels:
        {{- include "myapp.selectorLabels" . | nindent 8 }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - containerPort: {{ .Values.service.targetPort }}
          env:
            {{- range $key, $val := .Values.env }}
            - name: {{ $key }}
              value: {{ $val | quote }}
            {{- end }}
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
          readinessProbe:
            httpGet:
              path: /health
              port: {{ .Values.service.targetPort }}
            initialDelaySeconds: 10
            periodSeconds: 5

五、部署与管理

# 检查模板渲染结果
helm template myrelease ./myapp -f prod-values.yaml

# 安装(首次)
helm install myrelease ./myapp \
  --namespace production \
  -f prod-values.yaml

# 升级
helm upgrade myrelease ./myapp \
  --namespace production \
  -f prod-values.yaml \
  --set image.tag=1.1.0

# 回滚
helm rollback myrelease 1   # 回滚到第1个版本

# 查看历史
helm history myrelease

# 卸载
helm uninstall myrelease -n production

六、发布到 Helm 仓库

# 打包Chart
helm package ./myapp

# 发布到 OCI 仓库(推荐)
helm push myapp-1.0.0.tgz oci://registry.example.com/helm-charts

# 安装时直接从仓库拉取
helm install myrelease oci://registry.example.com/helm-charts/myapp --version 1.0.0

结语: Helm 的核心价值是把部署参数化,同一套 Chart 可以部署到 dev/staging/prod 不同环境,只需要不同的 values 文件。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐