一、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.yaml、service.yaml,引用values.yaml中的变量 - _helpers.tpl:定义可复用的模板片段(如标准化标签),减少重复代码
- NOTES.txt:安装后显示的使用说明(如访问服务的 URL)
- tests/ 目录:包含测试用例,验证部署后的应用状态(通过
helm test运行)
- Deployment/Service/Ingress 模板:如
-
模板语法示例
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.yaml的dependencies字段定义依赖项,执行helm dependency update下载并解压到本目录 - 直接放置:手动将依赖 Chart 复制到此目录
- 显式声明:在