Helm chart是一个软件包,其中包含将应用程序部署到Kubernetes集群的所有必要资源。这包括用于部署、服务、秘密和配置映射的YAML配置文件,这些配置文件定义了应用程序的所需状态。
上一篇文章我们介绍了helm的架构与安装,这篇文章让我们详细的深入了解helm chart使用。我们先看一个示例并自行部署一个chart。将深入研究 Helm 结构目录和文件。将修改在上一步中创建的图表。
helm create five_minute_learn
可以看到helm chart 的目录结构
-> % tree -a five_minute_learn
five_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 中的每个文件和目录并了解其重要性。
实例图片 - 互联网获取
我们看下与chart相关的所有信息,例如图表的名称和类型、图表的一些描述、版本等。
apiVersion: v2
name: five_minute_learn
description: 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"
一一查看每个字段:
除此之外,还有一些其他字段,例如维护者、依赖项、图标等。
我们之前讨论过 templates 文件夹,其中包含一些常用资源的模板化 Kubernetes 清单文件。但是,我们的应用程序中可能需要一些其他资源,我们必须将其创建为模板。我们还可以删除不需要的资源。
现在,我们将使用 2 个资源:部署和服务。因此,让我们删除其他文件和文件夹。我们的文件夹将如下所示:
-> % tree templates
templates
├── _helpers.tpl
├── deployment.yaml
└── service.yaml
我们还可以根据需要删除或添加清单文件中的字段。所以我们的deployment.yaml和service.yaml将如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
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: http
containerPort: 80
protocol: TCP
service.yaml
apiVersion: v1
kind: Service
metadata:
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: TCP
name: {{ .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: 2
image:
repository: nginx
tag: "1.25.3"
pullPolicy: Always
service:
name: nginx-service
type: ClusterIP
port: 80
targetPort: 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/
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failed
我们可以看到它成功运行并且图表中没有错误。
此命令检查模板中的值是否被替换。它将生成并显示带有替换值的所有清单文件。
helm template
如果运行此命令,将得到以下输出。
# Source: five_minute_learn/templates/service.yaml
# Service 部署配置
apiVersion: v1
kind: Service
metadata:
# 服务元数据
name: release-name-five_minute_learn
labels:
# 标签
helm.sh/chart: five_minute_learn-0.1.0
app.kubernetes.io/name: five_minute_learn
app.kubernetes.io/instance: release-name
app.kubernetes.io/version: "1.0.0"
app.kubernetes.io/managed-by: Helm
spec:
# 服务类型为 ClusterIP
type: ClusterIP
ports:
# 端口映射
- port: 80
targetPort: 8080
protocol: TCP
name: nginx-service
selector:
# 选择器
app.kubernetes.io/name: five_minute_learn
app.kubernetes.io/instance: release-name
---
# Source: five_minute_learn/templates/deployment.yaml
# Deployment 部署配置
apiVersion: apps/v1
kind: Deployment
metadata:
# 部署元数据
name: release-name-five_minute_learn
labels:
# 标签
helm.sh/chart: five_minute_learn-0.1.0
app.kubernetes.io/name: five_minute_learn
app.kubernetes.io/instance: release-name
app.kubernetes.io/version: "1.0.0"
app.kubernetes.io/managed-by: Helm
spec:
# 副本数为 2
replicas: 2
selector:
matchLabels:
# 选择器匹配标签
app.kubernetes.io/name: five_minute_learn
app.kubernetes.io/instance: release-name
template:
metadata:
labels:
# 模板标签
app.kubernetes.io/name: five_minute_learn
app.kubernetes.io/instance: release-name
spec:
containers:
- name: five_minute_learn
image: "nginx:1.25.3"
imagePullPolicy: Always
ports:
- name: http
containerPort: 80
protocol: TCP
部署时,release-name将被我们通过 helm 命令提供的release 名称覆盖。
此命令会试运行清单的安装并检查所有模板是否正常工作。如果出现任何问题,它会抛出错误。如果一切顺利,那么将看到将部署到集群中的清单输出。
helm install --dry-run <release-name> <chart-name>
这篇文章我们介绍了helm chart的配置,与基础概念,下一篇章我们将实践使用helm chart部署,管理 k8s服务,这里需要我们先搭建后自己的k8s 集群,将会推出最新的文章介绍k8s 的部署。