Helm是Kubernetes的包管理工具,通过Chart模板将应用部署配置参数化,实现一键安装、升级和回滚。在Kubernetes容器编排环境中,Helm Chart将散乱的YAML文件组织为可版本管理的应用包,解决了多环境部署配置差异和复杂应用依赖管理的问题。
Helm Chart目录结构与模板渲染机制
Chart是Helm的打包单元,本质是一个包含Kubernetes资源模板的目录。标准Chart结构:
myapp/
├── Chart.yaml # Chart元数据:名称、版本、描述
├── values.yaml # 默认配置参数
├── templates/ # K8s资源模板目录
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ ├── ingress.yaml
│ └── _helpers.tpl # 模板辅助函数
├── charts/ # 子Chart依赖
└── .helmignore # 忽略文件列表
Chart.yaml定义Chart的基本信息:
apiVersion: v2
name: myapp
description: A Helm chart for production web application
type: application
version: 1.0.0 # Chart版本
appVersion: "3.2.1" # 应用版本
keywords:
- web
- api
maintainers:
- name: ops-team
email: ops@company.com
dependencies:
- name: redis
version: "17.x.x"
repository: "https://charts.bitnami.com/bitnami"
condition: redis.enabled
模板文件使用Go template语法,通过values.yaml参数渲染为最终YAML:
# templates/deployment.yaml
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
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- if .Values.probes.enabled }}
livenessProbe:
httpGet:
path: {{ .Values.probes.liveness.path }}
port: http
initialDelaySeconds: {{ .Values.probes.liveness.initialDelaySeconds }}
readinessProbe:
httpGet:
path: {{ .Values.probes.readiness.path }}
port: http
initialDelaySeconds: {{ .Values.probes.readiness.initialDelaySeconds }}
{{- end }}
values.yaml参数化配置与环境差异化覆盖
values.yaml定义模板渲染的默认参数值:
# values.yaml
replicaCount: 3
image:
repository: registry.company.com/myapp
tag: ""
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 8080
ingress:
enabled: true
className: nginx
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
hosts:
- host: myapp.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: myapp-tls
hosts:
- myapp.example.com
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 1000m
memory: 1Gi
autoscaling:
enabled: true
minReplicas: 3
maxReplicas: 20
targetCPUUtilizationPercentage: 70
env:
LOG_LEVEL: info
DATABASE_URL: postgres://db:5432/myapp
redis:
enabled: true
针对不同环境(dev/staging/prod)创建覆盖配置:
# values-dev.yaml(开发环境)
replicaCount: 1
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
autoscaling:
enabled: false
ingress:
enabled: false
# values-prod.yaml(生产环境)
replicaCount: 5
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 2000m
memory: 2Gi
autoscaling:
enabled: true
minReplicas: 5
maxReplicas: 30
targetCPUUtilizationPercentage: 65
env:
LOG_LEVEL: warn
Helm部署操作:安装升级回滚全流程
# 创建新Chart骨架
helm create myapp
# 语法检查
helm lint myapp
# 渲染模板查看最终YAML(不实际部署)
helm template myapp ./myapp -f values.yaml -f values-prod.yaml
# 安装Chart(install)
helm install myapp ./myapp -f values.yaml -f values-prod.yaml --namespace production --create-namespace
# 升级Chart(upgrade)
helm upgrade myapp ./myapp -f values.yaml -f values-prod.yaml --namespace production --set image.tag=3.2.2 --wait --timeout 5m
# 查看已部署的Release
helm list -n production
# NAME NAMESPACE REVISION STATUS CHART APP VERSION
# myapp production 2 deployed myapp-1.0.0 3.2.1
# 查看Release历史
helm history myapp -n production
# REVISION STATUS CHART APP VERSION DESCRIPTION
# 1 superseded myapp-1.0.0 3.2.0 Install complete
# 2 deployed myapp-1.0.0 3.2.1 Upgrade complete
# 回滚到上一版本
helm rollback myapp 1 -n production
# 卸载Chart
helm uninstall myapp -n production
CI/CD流水线中的Helm自动化部署集成
在GitLab CI中集成Helm部署:
# .gitlab-ci.yml
stages:
- build
- deploy
variables:
HELM_CHART_PATH: ./charts/myapp
build:image:
stage: build
script:
- docker build -t $CI_REGISTRY/myapp:$CI_COMMIT_SHORT_SHA .
- docker push $CI_REGISTRY/myapp:$CI_COMMIT_SHORT_SHA
deploy:staging:
stage: deploy
image: alpine/helm:3.12.0
script:
- helm upgrade --install myapp $HELM_CHART_PATH
-f $HELM_CHART_PATH/values.yaml
-f $HELM_CHART_PATH/values-staging.yaml
--set image.tag=$CI_COMMIT_SHORT_SHA
--namespace staging
--wait
environment:
name: staging
only:
- develop
deploy:production:
stage: deploy
image: alpine/helm:3.12.0
script:
- helm upgrade --install myapp $HELM_CHART_PATH
-f $HELM_CHART_PATH/values.yaml
-f $HELM_CHART_PATH/values-prod.yaml
--set image.tag=$CI_COMMIT_SHORT_SHA
--namespace production
--wait
--atomic
environment:
name: production
when: manual
only:
- main
使用–atomic参数确保部署失败时自动回滚。Helm将Release状态存储在Kubernetes Secret中,支持版本追踪和回滚。多环境部署只需维护不同的values文件,Chart模板本身保持不变,实现配置与逻辑分离。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kuberneteshelmchart-bao-guan-li-yu-ying-yong-mu-ban-hua-bu/