Helm高级特性深度解析
立即解锁
发布时间: 2025-08-12 00:13:08 阅读量: 2 订阅数: 3 

### Helm高级特性深度解析
#### 1. 依赖图表的配置
在使用Helm时,`values.yaml` 文件中包含的依赖图表将作为默认值。若要更改某些值,就需要进行相应设置。例如,在 `rocket` 图表的 `values.yaml` 文件中有如下内容:
```yaml
booster:
image:
tag: 9.17.49
```
Helm 会识别这部分是针对 `booster` 图表的配置,并将镜像标签设置为指定值。依赖图表中的任何值都可以通过这种方式设置。在运行 `helm install` 等命令时,可以使用标志(如 `--set`)来设置依赖项和主图表的值。
如果对同一个图表有两个依赖项,可以在 `Chart.yaml` 文件中使用 `alias` 属性。该属性可用于为每个依赖项指定一个替代名称,这样就能在其他地方(如 `values.yaml` 文件)引用这些依赖项。
#### 2. 依赖的耦合方式
依赖项可以采用紧密耦合或松散耦合的方式:
- **紧密耦合**:使用 `Chart.yaml` 文件指定依赖项会导致图表之间的紧密耦合。在升级时,必须升级整个组。紧密耦合的好处是可以使用单个 Helm 命令安装整个图表集合,适用于向公司或组织外部的人员分发图表。
- **松散耦合**:在松散耦合的情况下,可以独立安装每个图表,每个图表作为一个独立的实例运行,可作为其他服务连接的服务。这种方式允许独立更改和升级每个图表,常用于在自己的组织内创建和运行图表。
#### 3. 启用依赖的条件标志
Helm 允许通过配置启用或禁用依赖项。例如,在提供 WordPress 博客解决方案时,安装人员可以选择使用数据库即服务或包含的数据库。这可以通过两种不同的配置方式实现:
- **`condition` 属性**:当要通过依赖项控制单个功能的启用或禁用时,可以使用依赖项的 `condition` 属性。例如,在 `Chart.yaml` 文件的依赖项部分:
```yaml
dependencies:
- name: booster
version: ^1.0.0
condition: booster.enabled
repository: https://raw.githubusercontent.com/Masterminds/learning-helm/main/chapter6/repository/
```
在 `values.yaml` 文件中对应的部分为:
```yaml
booster:
enabled: false
```
默认情况下,依赖项是禁用的。安装图表时,可以通过传递值来启用它。
- **`tags` 属性**:当要启用或禁用涉及依赖项的多个功能时,可以使用 `tags` 属性。例如,在另一个名为 `tag` 的图表的依赖项部分:
```yaml
dependencies:
- name: booster
tags:
- faster
version: ^1.0.0
repository: https://raw.githubusercontent.com/Masterminds/learning-helm/main/chapter6/repository/
- name: rocket
tags:
- faster
version: ^1.0.0
repository: https://raw.githubusercontent.com/Masterminds/learning-helm/main/chapter6/repository/
```
在图表的 `values.yaml` 文件中使用 `tags` 属性:
```yaml
tags:
faster: false
```
默认情况下,带有 `faster` 标签的依赖项是禁用的。安装或升级图表时,用户可以传递 `true` 值来启用它们。
#### 4. 从子图表导入值到父图表
有时需要从子图表导入值到父图表,Helm 提供了两种方法:
- **`exports` 属性**:`exports` 是 `values.yaml` 文件中的一个特殊顶级属性。当子图表声明了 `export` 属性时,其内容可以直接导入到父图表中。例如,子图表的 `values.yaml` 文件中有:
```yaml
exports:
types:
foghorn: rooster
```
父图表将子图表声明为依赖项时,可以从 `exports` 导入:
```yaml
dependencies:
- name: example-child
version: ^1.0.0
repository: https://charts.example.com/
import-values:
- types
```
在父图表的计算值中,`types` 现在可以在顶级访问,相当于:
```yaml
foghorn: rooster
```
- **子 - 父格式**:当父图表想从子图表导入值,但子图表未导出该值时,也可以告诉 Helm 将子图表的值拉到父图表中。例如,子图表的 `values.yaml` 文件中有:
```yaml
types:
foghorn: rooster
```
父图表声明依赖项时,可以使用子文件和父文件导入值:
```yaml
dependencies:
- name: example-child
version: ^1.0.0
repository: https://charts.example.com/
import-values:
- child: types
parent: characters
```
在这两种导入方法中,都使用了依赖项的 `import-values` 属性。Helm 能够区分不同的格式,并且可以混合使用这两种方法。
#### 5. 库图表
在创建多个相似图表时,可以使用库图表。库图表类似于软件库,提供可重用的功能,可被其他图表导入和使用,但本身不能安装。
创建新的库图表时,首先要删除 `templates` 目录和 `values.yaml` 文件的内容,然后在 `Chart.yaml` 文件中将 `type` 设置为 `library`。例如,名为 `mylib` 的图表的 `Chart.yaml` 文件如下:
```yaml
apiVersion: v2
name: mylib
type: library
description: an example library chart
version: 0.1.0
```
`templates` 目录中以 `_` 开头的文件不会渲染清单发送到 Kubernetes,通常辅助模板和代码片段放在 `_*.tpl` 和 `_*.yaml` 文件中。例如,`mylib` 图表中名为 `_configmap.yaml` 的模板文件:
```yaml
{{- define "mylib.configmap.tpl" -}}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "mylib.fullname" . }}
labels:
{{- include "mylib.labels" . | nindent 4 }}
data: {}
{{- end -}}
{{- define "mylib.configmap" -}}
{{- template "mylib.util.merge" (append . "mylib.configmap.tpl") -}}
{{- end -}}
```
其中定义了两个模板:`mylib.configmap.tpl` 包含资源的模板,`mylib.configmap` 是另一个图表将使用的特殊模板,它会将 `mylib.configmap.tpl` 与包含覆盖内容的模板合并。
合并函数 `mylib.util.merge` 如下:
```yaml
{{- /*
mylib.util.merge will merge two YAML templates and output the result.
This takes an array of three values:
- the top context
- the template name of the overrides (destination)
- the template name of the base (source)
*/ -}}
{{- define "mylib.util.merge" -}}
{{- $top := first . -}}
{{- $overrides := fromYaml (include (index . 1) $top)
```
0
0
复制全文
相关推荐










