- 课程随堂笔记: Kubernetes全栈架构师:基于世界500强的k8s实战课程
- Helm 官方文档地址: helm.sh
什么是 Chart
Helm 使用的包格式称为 chart。chart 就是一个描述 Kubernetes 相关资源的文件集合。单个 chart 可以用来部署一些简单的,类似于 memcache pod,或者某些复杂的 HTTP 服务器以及 Web 全栈应用,数据库,缓存等等。
Chart 是作为特定目录布局的文件被创建的。它们可以打包到要部署的版本存档中。
如果你想下载和查看一个发布的 chart,但不安装它,可以使用以下命令下载 chart 包
1
helm pull chartrepo/chartname
Chart 的文件结构
使用以下命令创建一个 Chart
1
helm create helm-test
查看生成的 chart 目录结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# tree helm-test/
helm-test/
├── charts # 这个 charts 的依赖组件,可以是其他的 chart 包
├── Chart.yaml # 当前这个 chart 的基本信息
├── templates # 模板文件位置
│ ├── deployment.yaml
│ ├── _helpers.tpl # 自定义的模板或者函数
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt # Chart 安装完成后的提醒信息
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests # 测试文件
│ └── test-connection.yaml
└── values.yaml # 配置全局变量或者一些参数
3 directories, 10 filesChart.yaml 文件内常用的配置信息:
- apiVersion: Chart 的 apiVersion,目前默认都是 v2
- name: Chart 的名字
- type: Chart 的类型 [可选]
- version: Chart 包自己的版本号
- appVersion: Chart 内需要部署的应用的版本号 [可选]
- description: Chart 的描述信息 [可选]
Chart 和版本控制
每个 chart 都必须有个版本号,版本必须遵循 语义化版本2
标准。不像老版的 Helm,Helm v2 以及以后的版本会使用版本号作为发布标记。仓库中的包通过名称加版本号进行标识。
apiVersion
对于至少需要 Helm 3 的 chart,apiVersion 字段应该是 v2。Chart支持之前 apiVersion 设置为 v1 的 Helm 版本,并且在 Helm 3 中仍然可安装。
v1 到 v2 的区别
- dependencies 字段定义了chart的依赖,针对于v1 版本的chart被放置在分隔开的requirements.yaml 文件中
- type 字段, 用于识别应用和库类型的 chart。有两种类型: application 和 library。 应用是默认类型,是可以完全操作的标准chart。
appVersion
注意这个 appVersion 字段与 version 字段并不相关。这是指定应用版本的一种方式。比如,这个 drupal
chart 可能有一个 appVersion: “8.2.1”,表示包含在 chart(默认)的 Drupal 的版本是8.2.1。此字段仅供参考,对chart版本计算没有影响。强烈建议使用引号将版本括起来。它强制YAML解析器将版本号视为字符串。不加引号在某些场景会出现解析问题。
从 Helm v3.5.0 开始,helm create 会将默认的 appVersion 用引号括起来。
kubeVersion
可选的 kubeVersion 字段可以在支持的Kubernetes版本上定义语义化版本约束,Helm 在安装chart时会验证这个版本约束, 并在集群运行不支持的Kubernetes版本时显示失败。
版本约束可以包括空格分隔和比较运算符,比如:
1
>= 1.13.0 < 1.15.0
或者它们可以用或操作符 || 连接,比如:
1
>= 1.13.0 < 1.14.0 || >= 1.14.1 < 1.15.0
Chart 的弃用
在Chart仓库管理chart时,有时需要废弃一个chart。 Chart.yaml 中可选的deprecated字段可以用来标记已弃用的chart。 如果latest版本被标记为已弃用,则所有的chart都会被认为是已弃用的。以后可以通过发布未标记为已弃用的新版本来重新使用chart名称。
弃用 chart 的工作流是:
- 升级chart的 Chart.yaml 文件,将这个chart标记为已弃用, 并更改版本
- 在chart仓库中发布新版的chart
- 从源仓库中移除这个chart (比如用 git)
Chart 的依赖
Helm 中,chart 可能会依赖其他任意个 chart。 这些依赖可以使用 Chart.yaml 文件中的 dependencies 字段动态链接,或者被带入到 charts/
目录并手动配置。
使用 dependencies 字段管理依赖
当前的 chart 依赖的其他 chart 会在 dependencies 字段定义为一个列表,如下:
1
2
3
4
5
6
7dependencies:
- 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,如下
1
helm repo add fantastic-charts https://fantastic-charts.storage.googleapis.com
- 使用仓库名称代替 URL 时如下
1
2
3
4dependencies:
- name: awesomeness
version: 1.0.0
repository: "@fantastic-charts"一旦你定义好了依赖,运行 helm dependency update 就会使用你的依赖文件下载所有你指定的 chart 到你的 charts/ 目录。
1
2
3
4
5
6
7
8
9
10$ 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
依赖中的 tag 和条件字段
除了上面的其他字段外,每个需求项可以包含可选字段 tags 和 condition。所有的 chart 会默认加载。如果存在 tags 或者 condition 字段,它们将被评估并用于控制它们应用的chart的加载。
- condition: 条件字段,包含一个或多个YAML路径(用逗号分隔)。如果这个路径在上层 values 中已存在并解析为布尔值,chart 会基于布尔值启用或禁用 chart。 只会使用列表中找到的第一个有效路径,如果路径为未找到则条件无效。
- tags: tag 字段是与 chart 关联的YAML格式的标签列表。在顶层 value 中,通过指定 tag 和布尔值,可以启用或禁用所有的带 tag 的 chart。
示例如下
- Chart.yaml 文件内容定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15dependencies:
- 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- values.yaml 文件内容定义
1
2
3
4
5subchart1:
enabled: true
tags:
front-end: false
back-end: true
在上面的例子中,所有带 front-endtag的chart都会被禁用,但只要上层的value中 subchart1.enabled 路径被设置为 ‘true’,该条件会覆盖 front-end标签且 subchart1 会被启用。
一旦 subchart2使用了back-end标签并被设置为了 true,subchart2就会被启用。 也要注意尽管subchart2 指定了一个条件字段, 但是上层value没有相应的路径和value,因此这个条件不会生效。
使用带有标签和条件的 CLI
--set
参数一如既往可以用来设置标签和条件值。
1 | helm install --set tags.front-end=true --set subchart2.enabled=false |
标签和条件的解析:
- 条件(当设置在value中时)总是会覆盖标签 第一个 chart 条件路径存在时会忽略后面的路径。
- 标签被定义为 ‘如果任意的chart标签是true,chart就可以启用’。
- 标签和条件值必须被设置在顶层value中。
- value 中的 tags: 键必须是顶层键。 全局和嵌套的tags:表现在不支持了。
手动管理依赖
如果对依赖进行更多控制,通过将有依赖关系的 chart 复制到 charts/ 目录中来显式表达这些依赖关系。
依赖应该是一个解压的chart目录。但是名字不能以_或.开头,否则会被chart加载器忽略。
模板和变量
Helm Chart 模板是按照 Go模板语言书写, 增加了50个左右的附加模板函数 来自 Sprig 库 和一些其他 指定的函数。
- Sprig 库: Sprig
- 指定的函数: chart开发提示和技巧
所有模板文件存储在 chart 的 templates/
文件夹。 当 Helm 渲染 chart 时,它会通过模板引擎遍历目录中的每个文件。
模板的 Value 通过两种方式提供:
- Chart 开发者可以在 chart 中提供一个 values.yaml 的文件,这个文件包含了默认的值;
- Chart 用户可以提供一个包含了 value 的 YAML 文件。可以在命令行使用 helm install 命令时提供。
当用户提供自定义value时,这些 value 会覆盖 chart 的 values.yaml 文件中 value。
模板文件
模板文件遵循书写 Go 模板的标准惯例,模板文件的例子看起来像这样:
1 | apiVersion: apps/v1 |
内置的变量
Values 通过模板中 .Values
对象可访问的 values.yaml 文件(或者通过 --set
参数)提供, 也可以从模板中访问其他预定义的数据片段。
以下值是内置的,对每个模板都有效,并且可以被覆盖。和所有值一样,名称区分大小写:
- Release.Name: 实例的名称,helm install指定的名字
- Release.Namespace: 应用实例的命名空间
- Release.Service: 组织版本的服务
- Release.IsUpgrade: 如果当前操作是升级或回滚,设置为true
- Release.IsInstall: 如果当前操作是安装,设置为true
- Release.Revision: 此次修订的版本号,从1开始,每次升级回滚都会增加1
- Chart: Chart.yaml 文件中的内容,比如可以使用 Chart.Version 表示应用版本,Chart.Name 表示 Chart 的名称
注意: 任何未知的 Chart.yaml 字段会被抛弃。在Chart对象中无法访问。因此, Chart.yaml 不能用于将任意结构的数据传递到模板中。不过 values 文件可用于此。