云原生应用管理:原理与实践
上QQ阅读APP看书,第一时间看更新

2.1.3 Chart Dependences

在Helm中,一个Chart能够依赖多个Chart。这些依赖能够动态地写入requirements.yaml或者直接放到charts/文件夹中手动管理。

虽然手动管理依赖灵活性更强,但是这里还是推荐使用requirements.yaml文件来管理依赖,这样可以提高文件的可溯源性。

requirements.yaml文件能够列出当前Chart依赖的其他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的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.
Saving 2 Charts
Downloading apache from repo http://example.com/Charts
Downloading mysql from repo http://another.example.com/Charts

当使用helm dependency update命令解析依赖文件时,会下载压缩文件到charts/文件夹。因此对于上面的例子,在charts/文件夹下会看到如下文件。


charts/
  apache-1.2.3.tgz
  mysql-3.2.1.tgz

使用requirements.yaml管理依赖是一种非常好的办法,因为仅使用一条命令就可以更新依赖,而且其他合作的人员也能很容易地从文件中读取到依赖的信息。

1.alias

除了上面介绍的属性,每个依赖项都能包含一个alias字段。正如这个字段表达的意思一样,一旦设置了这个字段,就可以在Chart中使用这个设置的名称来引用Chart。


# 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

通过上面这个例子,我们得到了3个依赖名称:subchart、new-subchart-1和new-subchart-2。

使用手动管理Chart也能实现这个目的,可以把同样的Chart使用不同的名字复制到charts/文件夹中。

2.tag和condition

所有在requirements.yaml声明的Chart都会默认被加载,但是依赖项添加了tag和condition属性后,Helm就会计算一下条件,如果条件不满足,就不会加载对应的依赖项。

tags字段在yaml中是一个列表。在父values中,如果有tag指定的字段,就会根据tag字段所设置的布尔值决定是否加载。

condition字段使用一个或者多个yaml段落来表示,它们之间使用逗号分隔。如果有重名的字段,那么只有第一个字段会被计算,其他的不识别的字段不会影响结果。


# 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标签的文件都会被禁止加载。但是subChart1.enabled的值是true,因此condition会覆盖front-endtag,subChart1最终还是会被加载。subChart2含有back-end标签且值为true,subChart2也会被加载。注意,虽然subChart2也有condition字段,但是字段内的标签并没有对应的值,所以忽略不计。

tags和condition的区别如下所示:

·condition(如果对应的标签有值)总是会覆盖tags;

·只有第一个condition会被计算,后面的标签都会被忽略;

·tags的计算规则是,如果其中任何一个tag是true,那么就会加载这个Chart。

3.通过requirements.yaml导入子Chart value

在一些情况下,有可能需要将子Chart内的value传递到父Chart中,作为一个通用的参数,这时候我们就需要exports这个关键字的功能了。

被exports声明的值能够在父Chart使用,在yaml文件中以列表的形式出现。列表中的每一个键值都需要从子Chart中查找到。下面我们通过一个例子来说明exports的用法。


# parent's requirements.yaml file
    ...
    import-values:
      - data

# child's values.yaml file
...
exports:
  data:
    myint: 99

我们在文件中指定了键值data,那么Helm就会从子Chart的exports域开始查找,最终使用对应的键值。


# parent's values file
...
myint: 99

4.通过Charts/目录手动管理依赖

如果我们需要对依赖进行更多的细粒度控制,可以手动复制依赖的Chart到charts/文件夹内。依赖的Chart既可以是已经打包好的压缩文件(foo-1.2.3.tgz),也可以是一个未打包的文件夹。但是它们的名字不能以“_”或者“.”开头,这些符号开头的文件都会被Helm忽略。

例如,如果Wordpress Chart依赖Apache Chart,那么Apache Chart就会以如下形式放到Wordpress中。


wordpress:
  Chart.yaml
  requirements.yaml
  # ...
  Charts/
    apache/
      Chart.yaml
      # ...
    mysql/
      Chart.yaml
      # ...

5.依赖Chart最终操作顺序

上文我们介绍了如何管理Chart依赖,那么这些依赖是如何影响Helm的安装和升级的呢?

我们假设有一个Chart A,其中包含如下文件;

·namespace:A-Namespace;

·statefulset:A-StatefulSet;

·service:A-Service。

Chart A依赖Chart B,Chart B包含如下文件:

·namespace:B-Namespace;

·replicaset:B-ReplicaSet;

·service:B-Service。

当使用helm install命令安装Chart A的时候,Chart会按照如下顺序进行安装:

·A-Namespace;

·B-Namespace;

·A-StatefulSet;

·B-ReplicaSet;

·A-Service;

·B-Service。

这是因为当使用helm install安装Chart的时候,所有的Kubernetes资源包括它的依赖会有如下特征:

·聚合成一个Chart;

·根据类型和名称进行排序;

·以依赖的顺序创建。

所以一个Chart就能把自己和依赖的Chart的所有资源都安装到Kubernetes集群中,关于Helm默认的类型安装顺序我们会在后面的章节中介绍。