首页 > 数据库 > 数据库开发技术 > Helm chart 实践
Helm chart是一个软件包,其中包含将应用程序部署到Kubernetes集群的所有必要资源。这包括用于部署、服务、秘密和配置映射的YAML配置文件,这些配置文件定义了应用程序的所需状态。
上一篇文章我们介绍了helm的架构与安装,这篇文章让我们详细的深入了解helm chart使用。我们先看一个示例并自行部署一个chart。将深入研究 Helm 结构目录和文件。将修改在上一步中创建的图表。
helm create five_minute_learn可以看到helm chart 的目录结构
-> % tree -a five_minute_learnfive_minute_learn├── .helmignore├── Chart.yaml├── charts├── templates│ ├── NOTES.txt│ ├── _helpers.tpl│ ├── deployment.yaml│ ├── hpa.yaml│ ├── ingress.yaml│ ├── service.yaml│ ├── serviceaccount.yaml│ └── tests│ └── test-connection.yaml└── values.yaml
Helm Chart 中的每个文件和目录并了解其重要性。
.helmignore:这是一个隐藏文件,因此我们无法在图表结构中看到它。从目录内运行 ls -a 命令来检查它。它用于定义我们不想包含在 Helm Chart 中的所有文件。
Chart.yaml:包含图表的基本信息。
Charts:这是一个空目录。我们可以在此处添加主图表所依赖的任何图表结构。
templates:这是一个包含构建应用程序的所有 Kubernetes 清单文件的目录。默认情况下,helm 创建了deployment.yaml、service.yaml、hpa.yaml、ingress.yaml、serviceaccount.yaml清单文件。我们可以根据需要修改和覆盖这些文件。我们甚至可以添加其他 Kubernetes 对象的清单文件。这些清单文件可以被模板化以访问values.yaml文件中的值。
templates/NOTES.txt:这是一个纯文本文件,在成功部署图表后打印出来。
templates/_helpers.tpl:该文件包含多个方法和子模板。它有助于保持我们的图表井井有条,并避免在多个地方重复相同的代码。
templates/tests/:我们可以在图表中定义测试,以验证图表在安装后是否按预期工作。
value.yaml:此文件包含模板目录中清单文件的值。例如镜像名称、副本数量、HPA值等。我们可以根据环境创建不同的values.yaml文件并更改值。
实例图片 - 互联网获取

我们看下与chart相关的所有信息,例如图表的名称和类型、图表的一些描述、版本等。
apiVersion: v2name: five_minute_learndescription: A Helm chart for Kubernetes# A chart can be either an 'application' or a 'library' chart.## Application charts are a collection of templates that can be packaged into versioned archives# to be deployed.## Library charts provide useful utilities or functions for the chart developer. They're included as# a dependency of application charts to inject those utilities and functions into the rendering# pipeline. Library charts do not define any templates and therefore cannot be deployed.type: application# This is the chart version. This version number should be incremented each time you make changes# to the chart and its templates, including the app version.# Versions are expected to follow Semantic Versioning (https://semver.org/)version: 0.1.0# This is the version number of the application being deployed. This version number should be# incremented each time you make changes to the application. Versions are not expected to# follow Semantic Versioning. They should reflect the version the application is using.# It is recommended to use it with quotes.appVersion: "1.16.0"
一一查看每个字段:
apiVersion:指图表 API 版本。v2 是 Helm 3 版本的当前 apiVersion。
name:该字段指的是图表的名称。
description:有关舵图的一行详细信息。
type:有 2 种chart类型选项:application and library。application是指我们部署在 Kubernetes 上的chart。library是指可重复使用的chart,可以与其他chart一起使用。
version:它指的是我们图表的版本。
appVersion:它描述了我们应用程序的版本号。
除此之外,还有一些其他字段,例如维护者、依赖项、图标等。
我们之前讨论过 templates 文件夹,其中包含一些常用资源的模板化 Kubernetes 清单文件。但是,我们的应用程序中可能需要一些其他资源,我们必须将其创建为模板。我们还可以删除不需要的资源。
现在,我们将使用 2 个资源:部署和服务。因此,让我们删除其他文件和文件夹。我们的文件夹将如下所示:
-> % tree templatestemplates├── _helpers.tpl├── deployment.yaml└── service.yaml
我们还可以根据需要删除或添加清单文件中的字段。所以我们的deployment.yaml和service.yaml将如下所示:
apiVersion: apps/v1kind: Deploymentmetadata:name: {{ include "five_minute_learn.fullname" . }}labels:include "five_minute_learn.labels" . | nindent 4 }}spec:replicas: {{ .Values.replicaCount }}selector:matchLabels:include "five_minute_learn.selectorLabels" . | nindent 6 }}template:metadata:with .Values.podAnnotations }}annotations:toYaml . | nindent 8 }}end }}labels:include "five_minute_learn.selectorLabels" . | nindent 8 }}spec:containers:name: {{ .Chart.Name }}image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"imagePullPolicy: {{ .Values.image.pullPolicy }}ports:name: httpcontainerPort: 80protocol: TCP
service.yaml
apiVersion: v1kind: Servicemetadata:name: {{ include "five_minute_learn.fullname" . }}labels:{{- include "five_minute_learn.labels" . | nindent 4 }}spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: {{ .Values.service.targetPort }}protocol: TCPname: {{ .Values.service.name }}selector:{{- include "five_minute_learn.selectorLabels" . | nindent 4 }}
我们对 Kubernetes 对象清单文件进行模板化,以便我们可以通过使用每个环境的值文件动态为其分配值,从而在多个环境中重用它们。让我们了解一下这些模板。
Helm 使用模板指令,我们在大括号内提供对象参数。
{{ .Object.Parameter }}我们可以使用不同的对象。在我们的模板中,我们使用chart和值。我们提到了 Chart 对象,用于使用Chart.yaml中定义的参数,以及value.yaml的 Values 对象。
对于代码片段{{ .Values.replicaCount }}, Helm 将检查values.yaml文件,找到replicaCount参数,获取它的值,然后在deployment.yaml文件中渲染。类似地,对于代码片段{{ .Chart.Name }},它将检查Chart.yaml文件,找到Name参数,并获取它的值。
我们还可以看到一个片段{{ include “five_minute_learn.fullname” 。}},这里我们使用了 include 关键字。使用它,我们要求 Helm 检查_helpers.tpl定义了一些默认模板的文件并从那里获取值。five_minute_learn.fullname 因此它将根据那里的定义检查并获取值。
value.yaml文件是一个配置文件,用于设置各种参数的默认值。该文件中的所有值都将替换为我们在模板中使用的模板指令。
该文件的结构为键值对,其中键表示 Kubernetes 对象的字段。让我们将默认的values.yaml内容替换为以下内容。
replicaCount: 2image:repository: nginxtag: "1.25.3"pullPolicy: Alwaysservice:name: nginx-servicetype: ClusterIPport: 80targetPort: 8080
使用 Helm Chart 中的 values 文件来根据环境配置不同的值,例如在不同的环境中设置不同的 pod 副本数量。可以按照以下方式组织的 values 文件:
values-dev.yaml: 开发环境的配置。
values-qa.yaml: QA 环境的配置。
values-uat.yaml: UAT 环境的配置。
values-prod.yaml: 生产环境的配置。
每个文件中可以包含不同的配置,例如 pod 副本数量 (replicaCount)、资源限制 (resources) 等。例如,对于不同的环境,可以在相应的 values 文件中设置不同的 replicaCount 值。
可以使用 Helm 命令来指定要使用的 values 文件,例如:
helm install my-chart . -f values-dev.yaml # 在 dev 环境使用 dev 的 values 文件这样,Helm 将根据指定的 values 文件为的应用程序设置配置,并在 Kubernetes 集群中部署相应的资源。这样可以方便地在不同环境中部署相同的 Helm Chart,并根据需要自定义配置。
为了在实际部署之前验证我们的 helm 图表,helm 提供了多个命令。使用这些命令,我们可以检查所有内容是否就位且正确。
此命令运行一系列测试来验证图表是否有效并且所有缩进都正常。如果图表中出现任何问题,它会抛出错误。
helm lint 让我们针对我们的图表运行此命令。
➜ helm lint five_minute_learn/==> Linting five_minute_learn/[] Chart.yaml: icon is recommended1 chart(s) linted, 0 chart(s) failed
我们可以看到它成功运行并且图表中没有错误。
此命令检查模板中的值是否被替换。它将生成并显示带有替换值的所有清单文件。
helm template 如果运行此命令,将得到以下输出。
# Source: five_minute_learn/templates/service.yaml# Service 部署配置apiVersion: v1kind: Servicemetadata:# 服务元数据name: release-name-five_minute_learnlabels:# 标签helm.sh/chart: five_minute_learn-0.1.0app.kubernetes.io/name: five_minute_learnapp.kubernetes.io/instance: release-nameapp.kubernetes.io/version: "1.0.0"app.kubernetes.io/managed-by: Helmspec:# 服务类型为 ClusterIPtype: ClusterIPports:# 端口映射- port: 80targetPort: 8080protocol: TCPname: nginx-serviceselector:# 选择器app.kubernetes.io/name: five_minute_learnapp.kubernetes.io/instance: release-name---# Source: five_minute_learn/templates/deployment.yaml# Deployment 部署配置apiVersion: apps/v1kind: Deploymentmetadata:# 部署元数据name: release-name-five_minute_learnlabels:# 标签helm.sh/chart: five_minute_learn-0.1.0app.kubernetes.io/name: five_minute_learnapp.kubernetes.io/instance: release-nameapp.kubernetes.io/version: "1.0.0"app.kubernetes.io/managed-by: Helmspec:# 副本数为 2replicas: 2selector:matchLabels:# 选择器匹配标签app.kubernetes.io/name: five_minute_learnapp.kubernetes.io/instance: release-nametemplate:metadata:labels:# 模板标签app.kubernetes.io/name: five_minute_learnapp.kubernetes.io/instance: release-namespec:containers:- name: five_minute_learnimage: "nginx:1.25.3"imagePullPolicy: Alwaysports:- name: httpcontainerPort: 80protocol: TCP
部署时,release-name将被我们通过 helm 命令提供的release 名称覆盖。
此命令会试运行清单的安装并检查所有模板是否正常工作。如果出现任何问题,它会抛出错误。如果一切顺利,那么将看到将部署到集群中的清单输出。
helm install --dry-run <release-name> <chart-name>这篇文章我们介绍了helm chart的配置,与基础概念,下一篇章我们将实践使用helm chart部署,管理 k8s服务,这里需要我们先搭建后自己的k8s 集群,将会推出最新的文章介绍k8s 的部署。
原文作者:五分钟学SRE;如有侵权,请联系管理员删除。