Chart结构与初始化
Kubernetes容器编排中,直接编写和管理大量YAML清单文件效率低下,尤其在多环境部署和版本回滚场景下。Helm作为Kubernetes的包管理工具,通过模板化机制将应用配置抽象为可复用的Chart,大幅简化了部署流程。本文从Chart结构、模板编写到私有仓库搭建,梳理Helm在DevOps实践中的完整工作流。
Helm Chart是一组描述Kubernetes资源的文件集合,目录结构如下:
my-app/
├── Chart.yaml # Chart元信息
├── values.yaml # 默认配置值
├── templates/ # 模板文件目录
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ └── _helpers.tpl # 模板辅助函数
├── charts/ # 依赖子Chart
└── .helmignore
使用helm create命令生成基础Chart骨架:helm create my-app。Chart.yaml定义Chart的名称、版本和描述:
apiVersion: v2
name: my-app
description: Web应用部署Chart
type: application
version: 0.1.0
appVersion: "1.16.0"
模板编写与变量注入
Helm模板使用Go template语法,通过双花括号注入变量和逻辑。values.yaml中的值在模板中通过.Values访问:
# values.yaml
replicaCount: 3
image:
repository: nginx
tag: "1.25"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
Deployment模板中引用这些值:
# 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 }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: {{ .Values.service.port }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
_helpers.tpl定义复用的模板片段,避免重复代码:
{{- define "my-app.labels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end -}}
多环境配置管理
不同环境(开发、测试、生产)的配置差异通过自定义values文件实现。为每个环境创建独立的values文件:
# values-prod.yaml
replicaCount: 5
image:
tag: "1.25-prod"
service:
type: LoadBalancer
port: 443
resources:
limits:
cpu: 2000m
memory: 2Gi
部署时通过-f参数覆盖默认值:
# 开发环境
helm install my-app ./my-app -f values.yaml -n dev
# 生产环境
helm install my-app ./my-app -f values.yaml -f values-prod.yaml -n prod
私有Chart仓库搭建
团队协作中需要集中管理Chart,私有仓库是标准做法。使用Harbor搭建私有Chart仓库是最常见的方案。Harbor内置ChartMuseum支持,配置Chart仓库后,使用helm repo add添加:
# 添加私有仓库
helm repo add my-harbor https://harbor.example.com/chartrepo/library --username admin --password <password>
# 打包Chart
helm package ./my-app
# 上传Chart到Harbor
curl -u admin:<password> -X POST \
"https://harbor.example.com/api/v2.0/chartrepo/library/charts" \
-H "Content-Type: multipart/form-data" \
-F chart=@my-app-0.1.0.tgz
# 从仓库搜索和安装
helm search repo my-harbor/my-app
helm install my-app my-harbor/my-app -n prod
版本管理与回滚
Helm维护每次部署的Release版本,支持快速回滚:
# 查看部署历史
helm history my-app -n prod
# 回滚到上一个版本
helm rollback my-app 1 -n prod
# 升级Chart
helm upgrade my-app my-harbor/my-app -f values-prod.yaml -n prod
CI/CD流水线中集成Helm的典型流程:代码提交触发构建、镜像推送到Registry、helm package打包Chart、推送到Harbor仓库、helm upgrade执行滚动更新。整个流程通过GitLab CI或ArgoCD实现自动化,每次变更可追溯、可回滚。Helm的模板化能力配合values文件覆盖机制,使得同一套Chart可以在多个环境中复用,减少配置漂移风险。私有仓库集中管理Chart版本,配合CI/CD流水线实现应用的持续交付,是Kubernetes自动化部署的成熟实践方案。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/helm-bao-guan-li-shi-zhan-kubernetes-ying-yong-mu-ban-hua/