依赖管理
Chart 依赖关系
在 Helm 中,一个 chart 可能依赖于任何数量的其他 chart。这些依赖关系可以通过 requirements.yaml 文件动态链接或引入 charts/ 目录并手动管理。虽然有一些团队需要手动管理依赖关系的优势,但声明依赖关系的首选方法是使用 chart 内部的 requirements.yaml 文件。
用 requirements.yaml 来管理依赖关系
requirements.yaml 文件是列出 chart 的依赖关系的简单文件。
dependencies:
- name: apache
version: 1.2.3
repository: http://example.com/charts
- name: mysql
version: 3.2.1
repository: http://another.example.com/charts
- 该 name 字段是 chart 的名称。
- version 字段是 chart 的版本。
- repository 字段是 chart repo 的完整 URL。请注意,还必须使用 helm repo add 添加该 repo 到本地才能使用。
有了依赖关系文件,你可以通过运行 helm dependency update,它会使用你的依赖关系文件将所有指定的 chart 下载到你的 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 http://example.com/charts
Downloading mysql from repo http://another.example.com/charts
当 helm dependency update 检索 chart 时,它会将它们作为 chart 存档存储在 charts/ 目录中。因此,对于上面的示例,可以在 chart 目录中看到以下文件:
charts/
apache-1.2.3.tgz
mysql-3.2.1.tgz
通过 requirements.yaml 管理 chart 是一种轻松更新 chart 的好方法,还可以在整个团队中共享 requirements 信息。
requirements.yaml 中的 alias 字段
除上述其他字段外,每个 requirement 条目可能包含可选字段 alias。为依赖的 chart 添加别名会将 chart 放入依赖关系中,并使用别名作为新依赖关系的名称。如果需要使用其他名称访问 chart,可以使用 alias。
# parentchart/requirements.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
requirements.yaml 中的 tags 和 condition 字段
除上述其他字段外,每个需求条目可能包含可选字段 tags 和 condition。所有 charts 都会默认加载。如果存在 tags 或 condition 字段,将对它们进行评估并用于控制应用的 chart 的加载。
-
Condition: condition 字段包含一个或多个 YAML 路径(用逗号分隔)。如果此路径存在于顶级父级的值中并且解析为布尔值,则将根据该布尔值启用或禁用 chart。只有在列表中找到的第一个有效路径才被评估,如果没有路径存在,那么该条件不起作用。
-
Tags: 标签字段是与此 chart 关联的 YAML 标签列表。在顶级父级的值中,可以通过指定标签和布尔值来启用或禁用所有带有标签的 chart。
# parentchart/requirements.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
# parentchart/values.yaml
subchart1:
enabled: true
tags:
front-end: false
back-end: true
在上面的示例中,所有带有标签的 front-end 的 charts 都将被禁用,但由于 subchart1.enabled 的值在父项值中为 “真”,因此条件将覆盖该 front-end 标签,subchart1 会启用。由于 subchart2 被标记 back-end 和标签的计算结果为 true,subchart2 将被启用。还要注意的是,虽然 subchart2 有一个在 requirements.yaml 中指定的条件,但父项的值中没有对应的路径和值,因此条件无效。
--set
参数可使用来更改 tag 和 conditions 值。
helm install --set tags.front-end=true --set subchart2.enabled=false
- Conditions (设置 values) 会覆盖 tags 配置。第一个存在的 condition 路径生效,后续该 chart 的 condition 路径将被忽略。
- 如果 chart 的某 tag 的任一 tag 的值为 true,那么该 tag 的值为 true,并启用这个 chart。
- Tags 和 conditions 值必须在顶级父级的值中进行设置。
tags:
值中的关键字必须是顶级关键字。目前不支持全局和嵌套tags:
表格。
依赖管理
所有使用 helm 部署的应用中如果没有特别指定 chart 的名字都会生成一个随机的 Release name,例如 romping-frog、sexy-newton 等,跟启动 docker 容器时候容器名字的命名规则相同,而真正的资源对象的名字是在 YAML 文件中定义的名字,我们成为 App name,两者连接起来才是资源对象的实际名字:Release name-App name。
而使用 helm chart 部署的包含依赖关系的应用,都会使用同一套 Release name,在配置 YAML 文件的时候一定要注意在做服务发现时需要配置的服务地址,如果使用环境变量的话,需要像下面这样配置。
env:
- name: SERVICE_NAME
value: "{{ .Release.Name }}-{{ .Values.image.env.SERVICE_NAME }}"
这是使用了 Go template 的语法。至于 {{ .Values.image.env.SERVICE_NAME }}
的值是从 values.yaml 文件中获取的,所以需要在 values.yaml 中增加如下配置:
image:
env:
SERVICE_NAME: k8s-app-monitor-test
本地依赖
在本地当前 chart 配置的目录下启动 helm server,我们不指定任何参数,直接使用默认端口启动。
helm serve
将该 repo 加入到 repo list 中。
helm repo add local http://localhost:8879
在浏览器中访问 http://localhost:8879 可以看到所有本地的 chart。
然后下载依赖到本地。
helm dependency update
这样所有的 chart 都会下载到本地的 charts
目录下。
共享
我们可以修改 Chart.yaml 中的 helm chart 配置信息,然后使用下列命令将 chart 打包成一个压缩文件。
$ helm package .
打包出 mychart-0.1.0.tgz 文件,我们可以在 requirements.yaml 中定义应用所依赖的 chart,例如定义对 mariadb 的依赖:
dependencies:
- name: mariadb
version: 0.6.0
repository: https://kubernetes-charts.storage.googleapis.com
使用 helm lint .命令可以检查依赖和模板配置是否正确。