一、Helm自定义Chart

1.1 自定义Chart使用场景

1.简化应用部署

使用场景 当应用包含多个 Kubernetes 资源(如 Deployment、Service、ConfigMap、Ingress 等)且需要统一管理时,通过自定义 Chart 将资源模板化,避免重复编写 YAML 文件。

实现方式

  • 模板化配置:使用 values.yaml 定义变量,通过 {{ .Values.xxx }} 注入到模板中。
  • 依赖管理:通过 Chart.yaml 声明依赖的子 Chart(如 Redis、PostgreSQL),自动部署关联服务。

示例

# values.yaml
app:
  image: my-app:v1.2.0
  replicas: 3
service:
  type: ClusterIP
  port: 8080

优势

  • 一键部署helm install my-app ./my-chart 即可拉起完整应用栈。
  • 减少错误:避免手动编写多个资源文件时的拼写或格式错误。

2.多环境部署

使用场景 同一应用需部署到开发、测试、生产等不同环境,且各环境配置(如数据库地址、资源配额)不同时,通过自定义 Chart 实现环境差异化配置。

实现方式

  • 多环境 Values 文件
  • values-dev.yaml:开发环境(低资源、调试模式)。
  • values-prod.yaml:生产环境(高可用、严格资源限制)。
  • 动态注入配置:通过 -f 参数指定环境配置。

示例

# 部署到开发环境
helm install my-app ./my-chart -f values-dev.yaml

# 部署到生产环境
helm install my-app ./my-chart -f values-prod.yaml

优势

  • 配置隔离:避免环境间配置污染。
  • 快速切换:通过不同 Values 文件无缝切换环境。

3.快速迭代和回滚

使用场景 在敏捷开发中频繁更新版本或修复问题,需快速发布新版本或回退到历史稳定版本。

实现方式

  • 版本化发布:每次更新使用 helm upgrade 并指定版本号。
  • 历史版本追踪:Helm 自动记录每次发布的版本和配置。

示例

# 升级到新版本
helm upgrade my-app ./my-chart --set app.image=my-app:v1.3.0

# 查看发布历史
helm history my-app

# 回滚到版本 2
helm rollback my-app 2

优势

  • 秒级回滚:直接复用历史版本配置,避免重新部署。
  • 灰度发布:结合 --set 参数实现金丝雀发布(如逐步更新 Pod 副本)。

4.CI/CD集成

使用场景 在自动化流水线中集成 Helm,实现代码提交后自动构建镜像并部署到 Kubernetes。

实现方式

  • 流水线脚本:在 CI/CD 工具(如 Jenkins、GitLab CI)中调用 Helm 命令。
  • 动态生成 Values:根据 Git 分支或标签生成不同环境的 Values 文件。

示例

# GitLab CI 示例
deploy:
  stage: deploy
  script:
    - helm upgrade --install my-app ./my-chart 
      --set app.image=$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
      -f values-$CI_ENVIRONMENT_NAME.yaml

优势

  • 全自动化:从代码提交到生产部署无需人工干预。
  • 环境一致性:确保测试环境与生产环境配置完全一致。

5.项目一键启动

使用场景 复杂项目包含多个微服务(如前端、后端、数据库、消息队列),需一键启动全部组件。

实现方式

  • 依赖编排:在 Chart.yaml 中声明子 Chart(如 MySQL、Redis),定义启动顺序和依赖关系。
  • 批量部署:通过 helm install 一键拉起所有服务。

示例

# Chart.yaml
dependencies:
  - name: mysql
    version: 9.10.0
    repository: https://charts.bitnami.com/bitnami
  - name: redis
    version: 17.11.0
    repository: https://charts.bitnami.com/bitnami

操作命令

# 下载依赖
helm dependency build ./my-chart

# 一键启动
helm install my-project ./my-chart

优势

  • 简化操作:无需逐个部署组件。
  • 依赖管理:自动处理服务间的启动顺序和配置依赖

1.2 创建一个Chart

创建一个Chart的命令格式:

helm create <chart-name>

创建一个Chart的具体示例

# 创建一个chart
[root@k8s-master01 ~]# helm create test

# 查看chart里面内容信息
[root@k8s-master01 ~]# ls test
charts  Chart.yaml  templates  values.yaml

创建一个Chart后,里面文件说明:

  • Chart.yaml

  • 作用:Chart 的元数据描述文件,定义 Chart 的基本信息。

  • 核心字段:

    • apiVersion:Chart API 版本(v2 适用于 Helm 3+)
    • name:Chart 名称(如 nginx-chart
    • version:遵循语义化版本规范(如 0.1.0
    • description:Chart 的简要说明
    • dependencies:声明依赖的其他 Chart(如 Redis、MySQL)
  • 示例

    yaml [root@k8s-master01 ~]# egrep -v "#|^$" test/Chart.yaml apiVersion: v2 name: test description: A Helm chart for Kubernetes type: application version: 0.1.0 appVersion: "1.16.0"

  • values.yaml

  • 作用:默认配置值的集合,用于参数化模板中的变量。

  • 关键用途:

    • 定义镜像名称、副本数、服务类型等可配置项
    • 支持通过 --set-f 覆盖默认值,实现多环境配置(如开发、生产)
  • 示例:

    yaml replicaCount: 2 image: repository: nginx tag: stable service: type: ClusterIP port: 80

  • templates/ 目录

  • 作用:存放 Kubernetes 资源模板文件(YAML),使用 Go 模板语法动态生成资源配置。

  • 核心文件:

    • Deployment/Service/Ingress 模板:如 deployment.yamlservice.yaml,引用 values.yaml 中的变量
    • _helpers.tpl:定义可复用的模板片段(如标准化标签),减少重复代码
    • NOTES.txt:安装后显示的使用说明(如访问服务的 URL)
    • tests/ 目录:包含测试用例,验证部署后的应用状态(通过 helm test 运行)
  • 模板语法示例

    yaml [root@k8s-master01 ~]# cat test/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "test.fullname" . }} labels: {{- include "test.labels" . | nindent 4 }} spec: {{- if not .Values.autoscaling.enabled }} replicas: {{ .Values.replicaCount }} {{- end }} selector: matchLabels: {{- include "test.selectorLabels" . | nindent 6 }} template: metadata: {{- with .Values.podAnnotations }} annotations: {{- toYaml . | nindent 8 }} {{- end }} labels: {{- include "test.labels" . | nindent 8 }} {{- with .Values.podLabels }} {{- toYaml . | nindent 8 }} {{- end }} spec: {{- with .Values.imagePullSecrets }} imagePullSecrets: {{- toYaml . | nindent 8 }} {{- end }} serviceAccountName: {{ include "test.serviceAccountName" . }} securityContext: {{- toYaml .Values.podSecurityContext | nindent 8 }} containers: - name: {{ .Chart.Name }} securityContext: {{- toYaml .Values.securityContext | nindent 12 }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.image.pullPolicy }} ports: - name: http containerPort: {{ .Values.service.port }} protocol: TCP livenessProbe: {{- toYaml .Values.livenessProbe | nindent 12 }} readinessProbe: {{- toYaml .Values.readinessProbe | nindent 12 }} resources: {{- toYaml .Values.resources | nindent 12 }} {{- with .Values.volumeMounts }} volumeMounts: {{- toYaml . | nindent 12 }} {{- end }} {{- with .Values.volumes }} volumes: {{- toYaml . | nindent 8 }} {{- end }} {{- with .Values.nodeSelector }} nodeSelector: {{- toYaml . | nindent 8 }} {{- end }} {{- with .Values.affinity }} affinity: {{- toYaml . | nindent 8 }} {{- end }} {{- with .Values.tolerations }} tolerations: {{- toYaml . | nindent 8 }} {{- end }}

  • charts/ 目录

  • 作用:存放当前 Chart 依赖的子 Chart(如数据库、中间件)

  • 依赖管理方式
    • 显式声明:在 Chart.yamldependencies 字段定义依赖项,执行 helm dependency update 下载并解压到本目录
    • 直接放置:手动将依赖 Chart 复制到此目录