Helm 3 完整教程(三):chart 的文件结构和字段详解

推荐阅读

Helm3(K8S 资源对象管理工具)视频教程:https://edu.csdn.net/course/detail/32506
Helm3(K8S 资源对象管理工具)博客专栏:https://blog.csdn.net/xzk9381/category_10895812.html

根据官网上的步骤,在学习完 Helm 3 的安装部分后,会学习关于 Helm 3 的使用。但是我认为在了解如何使用之前,应该先了解 chart 包的结构和如何编写一个简单的 chart,这样后面再学习如何使用 Helm 3,印象才会更加深刻。所以本文会对 chart 的目录结构以及功能和书写方式进行简要说明。

一、什么是 chart

charts 就是 Helm 要使用的包格式。它是一个描述 Kubernetes 相关资源的文件集合。一个 charts 可以用来部署一个简单的或者复杂的应用。例如数据库、消息队列、web 服务等等。通过创建一个特定目录树和文件来形成 chart,并将他们打包到一个带有版本号的压缩包中就可以进行部署了。

二、Chart 文件结构

chart 是一个具有特定目录树结构和文件的集合。目录名称是 chart 的名称(没有版本信息)。例如描述 WordPress 的 chart 会被存储在 wordpress 目录中:

wordpress/
  Chart.yaml          # 用于描述 chart 信息的 yaml 文件
  LICENSE             # 可选:用于存储关于 chart 的 LICENSE 文件
  README.md           # 可选:README 文件
  values.yaml         # 用于存储 chart 所需要的默认配置
  values.schema.json  # 可选: 一个使用JSON结构的 values.yaml 文件
  charts/             # 包含 chart 所依赖的其他 chart
  crds/               # 自定义资源的定义
  templates/          # chart 模板文件,引入变量值后可以生成用于 Kubernetes 的 manifest 文件
  templates/NOTES.txt # 可选: 包含简短使用说明的纯文本文件

三、Chart.yaml 文件结构和说明

Chart.yaml 文件是 chart 包中必须存在的文件,它包含以下字段:

apiVersion: 			# chart API 版本信息, 通常是 "v1" (必须)
name: 					# chart 的名称 (必须)
version: 				# chart 包的版本 (必须)
kubeVersion: 			# 指定 Kubernetes 版本 (可选)
type: 					# chart类型 (可选)
description: 			# 对项目的描述 (可选)
keywords:
  - 					# 有关于项目的一些关键字 (可选)
home: 					# 项目 HOME 页面的 URL 地址 (可选)
sources:
  - 					# 项目源码的 URL 地址 (可选)
dependencies: 			# chart 必要条件列表 (可选)
  - name: 				# chart名称 (nginx)
    version: 			# chart版本 ("1.2.3")
    repository: 		# (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name")
    condition: 			# (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )
    tags: 				# (可选)
      - 				# 用于一次启用/禁用 一组chart的tag
    import-values: 		# (可选)
      - 				# ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
    alias: 				# (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
maintainers: 			# (可选)维护者信息
  - name: 				# 维护者的名称
    email: 				# 维护者的邮件地址
    url: 				# 维护者的个人主页
engine: gotpl 			# 模板引擎的名称(可选,默认为 gotpl)
icon: 					# (可选)指定 chart 图标的 SVG 或 PNG 图像的 URL
appVersion: 			# 应用程序包含的版本
deprecated: 			# (可选,使用布尔值)该 chart 是否被废弃
annotations:
  example: 				# 按名称输入的批注列表 (可选).

接下来对部分关键的字段进行说明。

1. apiVersion 字段

对于部分仅支持使用 Helm 3 的 chart,apiVersion 应该指定使用 v2。对于可以同时支持 Helm3 和 Helm2 版本的 chart,可以将其设置为 v1。

注:v1 和 v2 的区别

  • v2 版本新增了 dependencies 字段用于定义 chart 的依赖关系。v1 版本中使用 requirement.yaml 文件来实现该功能
  • v2 版本新增了 type 字段,用于区分 chart 类型,取值为 application (默认)和 library,比如"应用类型 chart "和"库类型 chart "。
2. appVersion 字段

appVersion 字段与 version 字段并没有直接的联系。这是指定应用版本的一种方式。比如一个 chart 可能有一个 appVersion:"6.0.1",表示包含在 chart 中的版本是 6.0.1。此字段仅供参考,对 chart 版本计算没有影响。

版本号需要使用双引号括起来,否则在某些场景下,版本号不会被解析为字符串而导致其他的问题。从 Helm v3.5.0 版本开始,helm create 命令会自动将默认的 appVersion 用引号括起来。

3. kubeVersion 字段

kubeVersion 用于指定受支持的 Kubernetes 版本,Helm 在安装的时候会验证版本信息。如果在不受支持的 Kubernetes 上安装 chart 会显示失败。

版本约束可以包括空格分隔和比较运算符,比如:

>= 1.13.0 < 1.15.0

或者它们可以用或操作符 || 连接,比如:

>= 1.13.0 < 1.14.0 || >= 1.14.1 < 1.15.0

这个例子中排除了 1.14.0 版本,如果确定某些版本中的错误导致chart无法正常运行,这一点就很有意义。

除了版本约束外,使用运算符 = != > < >= <= 支持以下速记符号:

  • 闭合间隔的连字符范围1.1 - 2.3.4 等价于 >= 1.1 <= 2.3.4
  • 通配符 xX*1.2.x 等价于 >= 1.2.0 < 1.3.0
  • 波浪符号~范围 (允许改变补丁版本)~1.2.3 等价于 >= 1.2.3 < 1.3.0
  • 插入符号^范围 (允许改变次版本)^1.2.3 等价于 >= 1.2.3 < 2.0.0

本专栏原文链接:https://blog.csdn.net/xzk9381/category_10895812.html,转载请注明出处

4. deprecated 字段

在 Chart 仓库管理 chart 时,有时需要废弃一个 chart。 Chart.yaml 中可选的deprecated字段可以用来标记已弃用的 chart。 如果 latest 版本被标记为已弃用,则所有的 chart 都会被认为是已弃用的。可以通过发布未标记为弃用的新版本来重新使用chart名称。 弃用chart的步骤如下:

  1. 升级chart的 Chart.yaml 文件,将这个chart标记为已弃用, 并更改版本
  2. 在chart仓库中发布新版的 chart
  3. 从源仓库中移除这个chart (比如用 git)
5. type 字段

type字段定义了chart的类型。有两种类型: applicationlibrary。 应用是默认类型,是可以完全操作的标准 chart。库类型提供针对 chart 构建的实用程序和功能。 库类型 chart 与应用类型 chart 不同,因为它不能安装,通常不包含任何资源对象。关于库类型我们会在后面的文章中具体介绍

注意: 应用类型 chart 可以作为库类型 chart 使用。可以通过将类型设置为 library来实现。 然后这个库就被渲染成了一个库类型 chart,所有的实用程序和功能都可以使用。所有的资源对象不会被渲染。

6. dependencies 字段

在 Helm 中,chart 可能会依赖其他任意个chart。 这些依赖可以使用Chart.yaml文件中的dependencies 字段动态链接,也可以将其放入到 charts/ 目录中手动进行管理。

6.1 使用 dependencies 管理依赖

可以在 dependencies 字段中将当前 chart 依赖的其他 chart 定义为一个列表,例如下面的代码:

dependencies:
  - name: apache
    version: 1.2.3
    repository: https://example.com/charts
  - name: mysql
    version: 3.2.1
    repository: https://another.example.com/charts
  • name:依赖的 chart 的名称
  • version:指定所需的 chart 版本
  • repository:指定 chart 仓库的完整 URL。必须使用helm repo add在本地添加仓库,可以使用仓库的名称代替URL,例如下面的示例:

先添加一个仓库

$ helm repo add fantastic-charts https://fantastic-charts.storage.googleapis.com

使用仓库名称代替列表中的 URL,注意使用仓库名称的格式:

dependencies:
  - name: awesomeness
    version: 1.0.0
    repository: "@fantastic-charts"

定义好依赖后,使用 helm dependency update 命令就可以根据指定的依赖文件下载依赖包到 charts/ 目录下:

$ helm dep up foochart
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "local" chart repository
...Successfully got an update from the "stable" chart repository
...Successfully got an update from the "example" chart repository
...Successfully got an update from the "another" chart repository
Update Complete. Happy Helming!
Saving 2 charts
Downloading apache from repo https://example.com/charts
Downloading mysql from repo https://another.example.com/charts
6.2 为依赖包指定别名

除了上面介绍的字段外,还可以为依赖的 chart 包指定一个 alias 字段。这会为 chart 包创建一个别名,这样可以在后续使用别名来访问该 chart。例如下面的代码:

# parentchart/Chart.yaml

dependencies:
  - name: subchart
    repository: http://localhost:10191
    version: 0.1.0
    alias: new-subchart-1
  - name: subchart
    repository: http://localhost:10191
    version: 0.1.0
    alias: new-subchart-2
  - name: subchart
    repository: http://localhost:10191
    version: 0.1.0

上述例子中,我们会获得 parentchart 所有的3个依赖项:

subchart
new-subchart-1
new-subchart-2
7. tag 和 condition 字段

在 dependencies 字段包含的列表中,每个依赖项都可以包含两个可选字段 tag 和 condition。这两个字段用于判断和评估这个依赖的 chart 在指定条件下是否会被加载。

condition:该字段会包含一个或多个 value.yaml 文件中的 YAML 路径(用逗号分隔),如果这个路径已经在 value.yaml 文件中定义并设置了布尔值,那么该 chart 会基于这个布尔值来启用/禁用这个依赖的 chart。需要注意的是,在有多个路径的情况下,只会使用第一个有效路径的布尔值,其他的路径将会被忽略。如果所有的路径都不存在,那么 condition 无效。

tag:tag 字段用于为依赖的 chart 包添加标签,可以是一个标签列表。通过在 value.yaml 文件中指定 tag 和布尔值,可以启用或禁用所有属于该 tag 的 chart。

示例代码如下:

# parentchart/Chart.yaml

dependencies:
  - name: subchart1
    repository: http://localhost:10191
    version: 0.1.0
    condition: subchart1.enabled, global.subchart1.enabled
    tags:
      - front-end
      - subchart1
  - name: subchart2
    repository: http://localhost:10191
    version: 0.1.0
    condition: subchart2.enabled,global.subchart2.enabled
    tags:
      - back-end
      - subchart2

上面的代码中指定了两个依赖的 chart,并且设置了 condition 和 tag。接下来编写一个 value.yaml 文件:

# parentchart/values.yaml

subchart1:
  enabled: true
tags:
  front-end: false
  back-end: true

根据提供的 value,首先可以看到 tag 为 front-end 的 chart 都是禁用的状态,但是由于上层的 value 中,subchart1.enabled 路径被设置为 true,那么该条件就会覆盖 front-end 标签,所以依赖的 subchart1 是启用的状态。

接下来可以看到,back-end 标签的布尔值为 true,这代表所有使用该标签的 chart 都会处于启用的状态,并且由于 subchart2 中设置的 condition 路径不存在,所以这个 condition 不会生效。

如果在 value 中没有设置 tag 或 condition 路径和值,但是希望在部署 chart 的时候在命令行指定 tag 或 condition 路径和值,可以使用如下命令:

helm install --set tags.front-end=true --set subchart2.enabled=false

本专栏原文链接:https://blog.csdn.net/xzk9381/category_10895812.html,转载请注明出处

7.1 tag 和 condition 的注意事项

在使用 tag 和 condition 时,需要注意如下事项:

  • 如果在 value 中设置了 condition 的路径和值,那么 condition 的优先级会高于 tag
  • tag 和 condition 值必须配置在顶层的 value 中
  • value 中的 tags 键必须是顶层键,3.x 版本中不再支持全局和嵌套的 tags 键
8. 将子 chart 中的 value 导入到父 chart 中

在某些情况下,我们往往需要将子 chart 中的一些 value 导出,作为一个公共的值,以便于让父 chart 或其他的 chart 访问。导出 value 的过程是在 dependencies 字段中进行的。

导出 value 的方式有两种,下面逐个进行介绍。

8.1 将包含 exports 键的值导出

如果子 chart 的 value.yaml 文件的根结点中使用了 exports 字段,那么该字段下面的值可以使用 import-value 直接导出到父 chart 的 value 中。例如现在 dependencies 指定依赖的 chart 中,其 value.yaml 文件内容如下:

# child's values.yaml file

exports:
  data:
    myint: 99

根据上面的内容,只要我们在导入的列表中,指定了键名 data,那么 Helm 就会在子 chart 的 exports 字段中查找 data 键并导出它的内容。示例如下:

# parent's Chart.yaml file

dependencies:
  - name: subchart
    repository: http://localhost:10191
    version: 0.1.0
    import-values:
      - data

最终,父 chart 的 value 中就会包含我们导出的 value:

# parent's values

myint: 99

需要注意的是,这样的导入方式,最后保存在父 chart 的 value 只是 data 键下面的内容,而不包含 data 键。

8.2 访问指定键的 value 并导出到指定路径

有时候我们需要从子 chart 中导出的值并不是由 exports 字段定义的,所以如果要想访问不包含 exports 键的值,那么就需要指定要导入值的源键和将要把这个值存储到父 chart 中的目标路径。

例如现在子 chart 的 value.yaml 文件内容如下:

# subchart1's values.yaml file

default:
  data:
    myint: 999
    mybool: true

父 chart 的 value.yaml 文件内容如下:

# parent's values.yaml file

myimports:
  myint: 0
  mybool: false
  mystring: "helm rocks!"

现在要将子 chart 中的这两个值导入到父 chart 中,那么父 chart 的 Chart.yaml 文件内容应该如下:

# parent's Chart.yaml file

dependencies:
  - name: subchart1
    repository: http://localhost:10191
    version: 0.1.0
    ...
    import-values:
      - child: default.data
        parent: myimports

从上面的内容可以看到,从 subchart1 中找到 default.data 下面的值,并将其导入到父 chart 的 value.yaml 文件 myimport 键中,这样父 chart 的 value.yaml 文件最终的内容如下:

# parent's final values

myimports:
  myint: 999
  mybool: true
  mystring: "helm rocks!"

本专栏原文链接:https://blog.csdn.net/xzk9381/category_10895812.html,转载请注明出处

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

店伙计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值