
一、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运行)
-
-
模板语法示例
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 复制到此目录
-







暂无评论内容