创建和安装 Helm 图表
使用 Helm 图表,可以轻松地将应用程序部署到任何 Kubernetes 群集。 你可以使用 Helm 将应用程序的部署信息模板化为 Helm 图表,然后使用它来部署应用程序。
假设开发团队已将公司的宠物商店网站部署到 AKS 群集。 团队创建三个文件来部署网站:
- 描述如何在群集上安装和运行应用程序的部署清单,
- 描述如何在群集上公开网站的服务清单,以及
- 描述来自群集外部的流量如何路由到 Web 应用的流入量清单。
在软件开发生命周期中,团队会将这些文件部署到这三个环境中的每一个。 这三个文件中的每一个都使用特定于环境的变量和值进行更新。 由于每个文件都是硬编码的,因此,对这些文件进行维护容易出错。
Helm 如何处理图表?
Helm 客户端实现了一个基于 Go 语言的模板引擎,用于分析某个图表的文件夹中所有可用的文件。 模板引擎通过将图表的 templates/
文件夹中的模板与 Chart.yaml
和 values.yaml
文件中的值组合使用来创建 Kubernetes 清单文件。
在清单文件可用后,客户端可以安装、升级和删除在生成的清单文件中定义的应用程序。
如何定义 Chart.yaml
文件
Chart.yaml
是 Helm 图表定义中所需的文件之一,它提供有关图表的信息。 该文件的内容包括三个必填字段和各种可选字段。
三个必填字段包括:
apiVersion
:要使用的图表 API 版本。 对于使用 Helm 3 的图表,请将版本设置为v2
。name
:图表的名称。version
:图表的版本号使用语义版本控制 2.0.0,并遵循MAJOR.MINOR.PATCH
版本号表示法。
以下示例显示了基本 Chart.yaml
文件的内容:
apiVersion: v2
name: webapp
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.
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.
appVersion: 1.0.0
请注意示例文件中 type
字段的使用。 你可以创建图表来安装应用程序或库。 默认图表类型为 application
,可将其设置为 library
以指定图表将安装库。
可以使用许多可选字段来定制图表部署过程。 例如,可以使用 dependencies
字段为图表指定额外要求,例如依赖于数据库的 Web 应用。
注意
本模块不会详细介绍所有可选字段。 但是,模块的总结部分中提供了 Helm 文档的链接。
如何定义图表模板
Helm 图表模板是描述不同部署类型清单文件的文件。 图表模板以 Go 模板语言编写,提供了用于自动创建 Kubernetes 对象清单文件的模板函数。
模板文件存储在图表的 templates/
文件夹中。 模板引擎会处理这些文件以创建最终对象清单。
例如,假设开发团队使用以下部署清单文件部署解决方案的宠物店面组件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: store-front
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: store-front
template:
metadata:
labels:
app: store-front
spec:
nodeSelector:
"kubernetes.io/os": linux
containers:
- name: store-front
image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
ports:
- containerPort: 8080
name: store-front
env:
- name: VUE_APP_ORDER_SERVICE_URL
value: "http://order-service:3000/"
- name: VUE_APP_PRODUCT_SERVICE_URL
value: "http://product-service:3002/"
resources:
requests:
cpu: 1m
memory: 200Mi
limits:
cpu: 1000m
memory: 512Mi
startupProbe:
httpGet:
path: /health
port: 8080
failureThreshold: 3
initialDelaySeconds: 5
periodSeconds: 5
readinessProbe:
httpGet:
path: /health
port: 8080
failureThreshold: 3
initialDelaySeconds: 3
periodSeconds: 3
livenessProbe:
httpGet:
path: /health
port: 8080
failureThreshold: 5
initialDelaySeconds: 3
periodSeconds: 3
---
apiVersion: v1
kind: Service
metadata:
name: store-front
spec:
type: {{ .Values.storeFront.serviceType }}
ports:
- port: 80
targetPort: 8080
selector:
app: store-front
请注意使用 {{.Values.<property>}}
语法对容器影响的位置进行硬编码的方式。 此语法允许你为每个自定义值创建占位符。
手动创建 Helm 图表的过程很繁琐。 创建 Helm 图表的一种简单方法是使用 helm create
命令创建新的 Helm 图表。 然后,根据你的应用程序的要求自定义自动生成的文件。
如何定义 values.yaml
文件
你使用图表值自定义 Helm 图表的配置。 在部署图表时,图表值可以是预定义的,也可以由用户提供。
预定义值是一个区分大小写的值,它是在 Helm 图表的上下文中预定义的,不能由用户更改。 例如,可以使用 Release.Name
来引用发布或 Release.IsInstall
的名称,以检查当前操作是否是一个安装。
你还可以使用预定义的值从 Chart.yaml
的内容中提取数据。 例如,如果想要检查图表的版本,则引用 Chart.Version
。 请记住,只能引用已知字段。 你可以将预定义的值视为常量,以在你创建的模板中使用它们。
在模板文件中包含值名称的语法需要将值名称括在双大括号中,例如 {{.Release.Name}}
。 请注意,值名称前使用了句点。 以此方式使用句点时,句点将充当查找运算符,并指示该变量的当前作用域。
例如,下面的 YAML 代码段包含在值文件中定义的字典:
object:
key: value
若要访问模板中的值,可以使用以下语法:
{{ .Values.object.key }}
提供的值允许你处理图表模板中的任意值。 values.yaml
文件定义了这些值。
在此示例中,开发团队允许使用以下可配置的值:
apiVersion: apps/v1
kind: Deployment
metadata:
name: store-front
spec:
replicas: {{ .Values.replicaCount }}
...
containers:
- name: store-front
image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
ports:
...
---
apiVersion: v1
kind: Service
metadata:
name: store-front
spec:
type: {{ .Values.storeFront.serviceType }}
...
下面是 values.yaml
文件的示例:
...
replicaCount: 1
...
storeFront:
image:
repository: "ghcr.io/azure-samples/aks-store-demo/store-front"
tag: "latest"
serviceType: LoadBalancer
...
在模板引擎应用值后,最终结果将如以下示例所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: store-front
spec:
replicas: 1
...
containers:
- name: store-front
image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
ports:
---
apiVersion: v1
kind: Service
metadata:
name: store-front
spec:
type: LoadBalancer
...
如何使用 Helm 存储库
Helm 存储库是一个专用的 HTTP 服务器,它存储有关 Helm 图表的信息。 你可以使用 Helm 客户端配置 Helm 存储库,以使其使用 helm repo add
命令从存储库安装图表。
例如,可以通过运行以下命令将 Azure 市场 Helm 存储库添加到本地 Helm 客户端:
helm repo add azure-marketplace https://marketplace.azurecr.io/helm/v1/repo
有关存储库中可用图表的信息缓存在客户端主机上。 你需要定期更新缓存,以使用 helm repo update
命令提取存储库的最新信息。
通过 helm search repo
命令,可以在所有本地添加的 Helm 存储库中搜索图表。 你可以单独运行 helm search repo
命令,为每个已添加的存储库返回所有已知 Helm 图表的列表。 结果将列出图表的名称、版本,以及由图表部署的应用版本,如以下示例输出所示:
NAME CHART VERSION APP VERSION DESCRIPTION
azure-marketplace/airflow 11.0.8 2.1.4 Apache Airflow is a platform to programmaticall...
azure-marketplace/apache 8.8.3 2.4.50 Chart for Apache HTTP Server
azure-marketplace/aspnet-core 1.3.18 3.1.19 ASP.NET Core is an open-source framework create...
azure-marketplace/bitnami-common 0.0.7 0.0.7 Chart with custom tempaltes used in Bitnami cha...
azure-marketplace/cassandra 8.0.5 4.0.1 Apache Cassandra is a free and open-source dist...
你可以通过向 helm search repo
命令中添加搜索词来搜索特定图表。 例如,如果要搜索基于 ASP.NET 的图表,则可以使用以下命令:
helm search repo aspnet
在此示例中,本地客户端注册了两个存储库,并返回每个存储库的结果,如以下示例输出中所示:
NAME CHART VERSION APP VERSION DESCRIPTION
azure-marketplace/aspnet-core 1.3.18 3.1.19 ASP.NET Core is an open-source framework create...
bitnami/aspnet-core 1.3.18 3.1.19 ASP.NET Core is an open-source framework create...
如何测试 Helm 图表
Helm 提供了一个选项,用于生成模板引擎从图表创建的清单文件。 使用此功能,可以组合使用以下两个额外的参数在发布前测试图表:--dry-run
和 debug
。 --dry-run
参数可确保对安装进行模拟,--debug
参数则会启用详细输出。
helm install --debug --dry-run my-release ./chart-name
此命令列出的信息涉及已使用的值和所有生成的文件息。 可能需要滚动才能查看所有生成的输出。
如何安装 Helm 图表
使用 helm install
命令安装图表。 可以从以下任意位置安装 Helm 图表:
- 图表文件夹
- 已打包的
.tgz
tar 存档图表 - Helm 存储库
但是,必需的参数因图表位置而异。 在所有情况下,install
命令都需要你要安装的图表的名称,以及安装将创建的版本的名称。
可以使用文件的解压缩图表文件夹或打包的 .tgz
tar 存档来安装本地图表。 为了安装图表,helm
命令将引用图表位置的本地文件系统。 下面是 install 命令的一个示例,该命令将部署一个解压缩图表的一个版本:
helm install my-release ./chart-name
在上面的示例中,my-release
参数是发布的名称,./chart-name
参数是解压缩的图表包的名称。
通过引用打包的图表的文件名来安装打包的图表。 下面的示例显示了现在作为 tar 存档打包的同一应用程序的语法:
helm install my-release ./chart-name.tgz
从 Helm 存储库安装图表时,可以使用图表引用作为图表的名称。 图表引用包括两个参数,即存储库名称和图表的名称,如以下示例所示:
helm install my-release repository-name/chart-name
在示例中,repository-name/chart-name
参数包含存储库 repository-name
的引用以及图表的名称 chart-name
。