Kubernetes Helm Chart包管理与应用模板化部署实战配置

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/

(0)
小编小编
上一篇 14小时前
下一篇 14小时前

相关推荐