【云原生与DevOps】04-Helm Chart开发实战:打包你的第一个应用
·
专栏: 云原生 & 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 文件。
更多推荐

所有评论(0)