helm中的依赖关系

2022-11-15 23:00:01 浏览数 (1)

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的条目还可包含字段 tagscondition

代码语言:yaml复制
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 都会加载。如果存在 tagscondition 字段,将根据它们的值控制 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/)

0 人点赞