Helm中如何传递value

Helm是kubernetes的官方包管理工具。根据官网上的描述Helm is the best way to find, share, and use software built for Kubernetes.可以看出helm在kubernetes社区中的定位。

这篇文章并不是helm的入门文章,而是着重于helm中的chart之间如何传递value。希望进行helm入门的同学可以参考官方文档。

概述

在helm的使用过程中,经常会出现两种需求:

  1. 在父chart中读取子chart的某些value的值
  2. 在父chart中修改子chart的某些value的值

helm对于这两种场景提供了比较完备的支持,下面我们来具体讲一下解决方案。

在父chart中读取子chart的值

helm提供了两种方法来应对这种情况:

使用export格式

如果说一个child的chart在values的root下有一个叫做export的key,那么它的parent chart就可以直接在requirements里面通过指定需要import的key来将值import到自身的values里面,例子如下:

1
2
3
4
# parent's requirements.yaml file
...
import-values:
- data
1
2
3
4
5
# child's values.yaml file
...
exports:
data:
myint: 99

helm会发现,我们指定了要import data这个key,所以就去child的values.yaml里面寻找,发现了这个key有被export,于是就import了它的内容。

这时候的parent的values如下:

1
2
3
# parent's values file
...
myint: 99

需要注意,在parent的values中data这个key不会被import进来,只会import data的内容。如果希望把这个key也一起import进来,可以使用下面说的方法。

使用child/parent格式

如果我们想要获得一些不在exports这个key下面的值,我们就必须指定在child中要import的路径,以及在parent中的对应路径,如下:

1
2
3
4
5
6
7
8
9
# parent's requirements.yaml file
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
...
import-values:
- child: default.data
parent: myimports

根据如上的这个requirements文件,helm将会在child的chart中寻找default.data的值,并导入到parent中的myimports这个路径下。

假设parent和child初始的values如下:

1
2
3
4
5
6
# parent's values.yaml file

myimports:
myint: 0
mybool: false
mystring: "helm rocks!"
1
2
3
4
5
6
# subchart1's values.yaml file

default:
data:
myint: 999
mybool: true

那么导入之后,真正渲染出来的parent的values的值为:

1
2
3
4
5
6
# parent's final values

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

可以看出来,parent中的values把myint和mybool从subchart1里面import了进来。

在父chart中修改子chart的值

想要再父chart中修改子chart的值比较容易,假设子chart的名字是mychartabc,那么我们可以很简单地在父chart的values中通过以下方式进行修改:

1
2
3
4
5
# in parent's values.yaml
...

mychartabc:
key: value

这样就可以修改子chart的值了。

出处

https://docs.helm.sh/developing_charts/#importing-child-values-via-requirements-yaml

https://docs.helm.sh/chart_template_guide/#overriding-values-from-a-parent-chart