Helm自定义Chart:适用场景、创建方式与依赖管理

来自AI助手的总结
文章介绍了Helm自定义Chart的用途、创建方法及目录结构。
Helm自定义Chart:适用场景、创建方式与依赖管理

一、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 复制到此目录

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容