Helm是一个作用于k8s的包管理工具。类似于其它的包管理工具如apt/yum ,应用开发者可以管理应用包chart之间的依赖关系,以便于部署复杂的k8s应用。
定义依赖关系
在 helm中,一个 chart 可以依赖于任何数量的其他 chart。这些依赖关系可以在chart.yaml中的 dependencies字段定义。(helm2中是在requirements.yaml文件中定义)
代码语言:yaml复制dependencies:
- name: subchart1
version: ~1.2.3
repository: http://example.com/charts
- name: subchart2
version: 3.2.1
repository: http://another.example.com/charts
name 字段是 chart 的名称。version 字段是 chart可接受的版本,关于版本定义的语法,可以参考semver document。repository 字段是该 chart所在的repo 的完整 URL,该 repo须使用 helm repo add 添加到repo list中。
除上述必要字段外,每个dependencies的条目还可包含字段 tags
和 condition
。
dependencies:
- name: subchart1
repository: http://example.com/charts
version: 0.1.0
condition: subchart1.enabled, global.subchart1.enabled
tags:
- frontend
- subchart1
- name: subchart2
repository: http://example.com/charts
version: 0.1.0
condition: subchart2.enabled,global.subchart2.enabled
tags:
- backend
- subchart2
默认情况下所有 charts 都会加载。如果存在 tags
或 condition
字段,将根据它们的值控制 chart 的加载。
Condition - condition 字段包含一个或多个 YAML 路径,如果此路径存在于父级的values.yaml中并且解析为布尔值,则将根据该布尔值启用或禁用 chart。只有在列表中找到的第一个有效路径才被评估,如果没有路径存在,那么该条件不起作用。
Tags - 标签字段是与此 chart 关联的 YAML 标签列表。在顶级父级的值中,可以通过指定标签和布尔值来启用或禁用所有带有标签的 chart。
定义好dependencies字段后,通过运行 helm dependency update
,你的依赖中所有指定的 chart 将下载到你的 charts/
目录中。该命令会检查依赖中的chart是否存在于charts/
中并且处于可接受的版本,否则将拉取满足依赖关系的最新chart,并清理旧的依赖关系。
成功执行该命令后,将生成 Chart.lock
文件,用于将依赖关系重构为确切的版本。
管理子chart值
子chart将以压缩包的形式存在于charts目录下。我们可以在父chart的values.yaml中定义相应的字段来管理子chart的值。
以kafka为子chart为例,假设我们的目录如下:
代码语言:txt复制support/
├── Chart.lock
├── Chart.yaml
├── README.md
├── charts
│ └── kafka-0.21.2.tgz
├── templates
│ ├── init-kafka.job.yaml
│ └── testclient.yaml
└── values.yaml
kafka的chart中原本的values.yaml有如下字段:
代码语言:yaml复制topics: []
# - name: myExistingTopicConfig
# config: "cleanup.policy=compact,delete.retention.ms=604800000"
# - name: myExistingTopicReassignPartitions
# partitions: 8
# replicationFactor: 5
# reassignPartitions: true
当我们在values.yaml中如下配置时:
代码语言:yaml复制kafka:
topics:
- name: test1
partitions: 1
replicationFactor: 1
- name: test2
partitions: 1
replicationFactor: 1
topics会自动替换kafka子chart中的该字段,并在安装时配置test1和test2两个topic。
高级别的 chart 可以访问下面定义的所有变量。
安装顺序说明
值得注意的是,虽然我们可以在helm中定义依赖关系,但在安装过程中,并不会根据依赖关系顺序进行安装。
关于helm3的安装顺序可以参考helm-kind_sorter,helm的安装和卸载顺序都根据kind来决定,部分常见的kind的安装顺序如下:
<ol>
<li>Namespace</li>
<li>Secret</li>
<li>ConfigMap</li>
<li>StorageClass</li>
<li>PersistentVolume</li>
<li>PersistentVolumeClaim</li>
<li>ServiceAccount</li>
<li>CustomResourceDefinition</li>
<li>Service</li>
<li>Pod</li>
<li>Deployment</li>
<li>Job</li>
<li>Ingress</li>
<li>APIService</li>
</ol>
卸载的顺序与安装顺序相反。
如果想要控制某些安装顺序时,可以参考 Chart Hooks。
参考链接
1(https://whmzsu.github.io/helm-doc-zh-cn/chart/charts-zh_cn.html)
2(https://github.com/Masterminds/semver#checking-version-constraints )
3(https://github.com/helm/helm/blob/release-3.0/pkg/releaseutil/kind_sorter.go)
4(https://helm.sh/docs/topics/charts_hooks/)