Helm是Kubernetes生态中最广泛使用的包管理工具,将Kubernetes资源定义打包为可复用、可版本管理的Chart。通过Helm Chart,应用的部署参数与资源清单分离,一套Chart可适配开发、测试、生产多套环境。本文从Chart结构设计、模板编写、多环境部署到私有仓库搭建,覆盖Helm生产实践完整流程。
Helm Chart目录结构与初始化
使用helm create命令生成标准Chart骨架:
helm create myapp
# 目录结构:
# myapp/
# ├── Chart.yaml # Chart元数据(名称、版本、依赖)
# ├── values.yaml # 默认配置值
# ├── templates/ # Kubernetes资源模板
# │ ├── deployment.yaml
# │ ├── service.yaml
# │ ├── ingress.yaml
# │ ├── _helpers.tpl # 模板辅助函数
# │ └── NOTES.txt # 安装后提示信息
# └── charts/ # 依赖的子Chart
Chart.yaml定义Chart的版本和依赖关系:
apiVersion: v2
name: myapp
description: Web应用Helm Chart
type: application
version: 1.2.0 # Chart版本
appVersion: "3.1.0" # 应用版本
dependencies:
- name: redis
version: "18.x.x"
repository: "https://charts.bitnami.com/bitnami"
condition: redis.enabled
模板编写与values配置分离
Helm模板使用Go template语法,通过values.yaml注入配置参数。Deployment模板示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "myapp.fullname" . }}
labels:
{{- include "myapp.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
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:
- name: http
containerPort: {{ .Values.service.port }}
protocol: TCP
env:
{{- range $key, $val := .Values.env }}
- name: {{ $key }}
value: {{ $val | quote }}
{{- end }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
values.yaml定义默认配置,各环境通过覆盖文件差异化配置:
# values.yaml - 默认配置
replicaCount: 2
image:
repository: registry.example.com/myapp
tag: ""
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 8080
env:
APP_ENV: "production"
LOG_LEVEL: "info"
resources:
requests:
cpu: 250m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
多环境部署:values覆盖机制
Helm支持通过-f参数加载环境专属values文件,覆盖默认配置:
# values-dev.yaml
replicaCount: 1
image:
repository: registry.example.com/myapp
tag: dev-latest
env:
APP_ENV: "development"
LOG_LEVEL: "debug"
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
# 部署到开发环境
helm install myapp-dev ./myapp -f values.yaml -f values-dev.yaml -n dev-namespace
# 部署到生产环境
helm upgrade myapp-prod ./myapp -f values.yaml -f values-prod.yaml -n prod-namespace
# 查看渲染结果(不实际部署)
helm template myapp ./myapp -f values-prod.yaml | less
values文件的合并策略为深度覆盖:后加载的文件覆盖先加载的同名键。数组类型整体替换而非合并,需注意env等数组配置的完整覆盖问题。
Chart版本管理与私有仓库搭建
生产环境中Chart需要集中存储和版本管理。使用ChartMuseum搭建私有Helm仓库:
# 使用Docker部署ChartMuseum
docker run -d --name chartmuseum -p 8080:8080 -v /data/charts:/charts -e STORAGE=local -e STORAGE_LOCAL_ROOTDIR=/charts -e BASIC_AUTH_USER=admin -e BASIC_AUTH_PASS=chartpass chartmuseum/chartmuseum:latest
# 添加私有仓库
helm repo add private http://charts.example.com:8080 --username admin --password chartpass
# 打包Chart并上传
helm package ./myapp
curl -u admin:chartpass -T myapp-1.2.0.tgz http://charts.example.com:8080/api/charts
# 更新仓库索引并搜索
helm repo update
helm search repo private/myapp
CI/CD流水线集成与发布自动化
在GitLab CI中集成Helm实现自动化部署:
# .gitlab-ci.yml
stages:
- package
- deploy
package_chart:
stage: package
image: alpine/helm:3.14.0
script:
- helm lint ./charts/myapp
- helm package ./charts/myapp --version $CI_COMMIT_TAG
- curl -u $CHART_USER:$CHART_PASS -T myapp-*.tgz $CHART_URL/api/charts
only:
- tags
deploy_staging:
stage: deploy
image: alpine/helm:3.14.0
script:
- helm upgrade --install myapp-staging private/myapp
--version $CI_COMMIT_TAG
-f values-staging.yaml
--kubeconfig $KUBECONFIG_STAGING
-n staging
environment:
name: staging
only:
- tags
helm lint在打包前检查模板语法和values一致性,helm template在CI中预渲染资源清单供人工审查。部署时使用helm upgrade –install兼顾首次安装和后续升级,–atomic参数在部署失败时自动回滚到上一版本。
Chart测试与回滚操作
Helm支持内置测试Hook,在部署后自动运行验证:
# templates/tests/test-connection.yaml
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "myapp.fullname" . }}-test"
annotations:
"helm.sh/hook": test
"helm.sh/hook-delete-policy": "before-hook-creation,hook-succeeded"
spec:
containers:
- name: wget
image: busybox
command: ['wget', '--spider', '--timeout=5',
'http://{{ include "myapp.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never
# 运行测试
helm test myapp -n production
# 查看发布历史
helm history myapp -n production
# 回滚到上一版本
helm rollback myapp 1 -n production
# 回滚到指定版本
helm rollback myapp 3 -n production
helm rollback基于Kubernetes的ReplicaSet历史保留机制,回滚操作秒级完成。需注意回滚不会处理有状态应用的数据迁移问题,数据库等有状态组件的回滚需在应用层处理。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/helmchart-bao-guan-li-shi-zhan-kubernetes-ying-yong-da-bao/