侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 285 篇文章
  • 累计创建 125 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Helm3入门教程-24:子chart和全局值

孔子说JAVA
2022-05-04 / 0 评论 / 0 点赞 / 160 阅读 / 3,507 字 / 正在检测是否收录...

Helm3入门教程全系列,26小时轻松掌握Helm

到目前为止,我们只使用了一个chart。但chart可以使用依赖,称为子chart,它们也有自己的值和模板。该章节我们会创建一个子chart并看到从模板中访问值的不同方法。

在深入研究代码之前,需要了解一些子chart的重要细节:

  1. 子chart被认为是“独立的”,意味着子chart从来不会显示依赖它的父chart。
  2. 因此,子chart无法访问父chart的值。
  3. 父chart可以覆盖子chart的值。
  4. Helm有一个 全局值 的概念,所有的chart都可以访问。

浏览本节的示例之后,这些概念会变得更加清晰。

1、创建子chart

为了做这些练习,我们可以从本指南开始时创建的mychart/开始,并在其中添加一个新的chart。

$ cd mychart/charts
$ helm create mysubchart
Creating mysubchart
$ rm -rf mysubchart/templates/*

注意,和以前一样,我们删除了所有的基本模板,然后从头开始,在这个指南中,我们聚焦于模板如何工作,而不是管理依赖。在 Helm3入门教程-4:chart 的文件结构和字段详解 可以看到更多子chart运行的信息。

2、在子chart中添加值和模板

下一步,为mysubchart创建一个简单的模板和values文件。 mychart/charts/mysubchart 中应该已经有一个 values.yaml。 我们可以这样设置:

dessert: cake

接下来,我们将在 mychart/charts/mysubchart/templates/configmap.yaml 中创建一个新的配置映射模板 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-cfgmap2
data:
  dessert: {{ .Values.dessert }}

因为每个子chart都是独立的chart,可以单独测试mysubchart:

$ helm install --generate-name --dry-run --debug mychart/charts/mysubchart
SERVER: "localhost:44134"
CHART PATH: /Users/mattbutcher/Code/Go/src/helm.sh/helm/_scratch/mychart/charts/mysubchart
NAME:   newbie-elk
TARGET NAMESPACE:   default
CHART:  mysubchart 0.1.0
MANIFEST:
---
# Source: mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: newbie-elk-cfgmap2
data:
  dessert: cake

3、用父chart的值来覆盖子chart的值

原来的 mychart 现在是 mysubchart 的父chart。这种关系是基于 mysubchartmychart/charts 中这一事实。

因为mychart是父chart,可以在 mychart 指定配置并将配置推送到 mysubchart 。比如可以修改 mychart/values.yaml 文件如下:

favorite:
  drink: coffee
  food: pizza
pizzaToppings:
  - mushrooms
  - cheese
  - peppers
  - onions

mysubchart:
  dessert: ice cream

注意最后两行,在上述代码中 mysubchart 中的所有指令会被发送到 mysubchart 这个chart。所以如果运行 helm install --dry-run --debug mychart,我们可以看到 mysubchart 的配置已经被父类的值覆盖了:

# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: unhinged-bee-cfgmap2
data:
  dessert: ice cream

现在,子chart的值已经被顶层的值覆盖了。

这里需要注意个重要细节。我们没有更改 mychart/charts/mysubchart/templates/configmap.yaml 的模板以指向 .Values.mysubchart.dessert。从模板的角度来看,值仍然位于 .Values.dessert。当模板引擎传递值时,会设置作用域。范围。 因此对于 mysubchart 模板,只有特定于 mysubchart 的值才会在 .Values 中可用。

但是有时确实希望某些值对所有模板都可用。这是使用全局chart值完成的。

4、全局Chart值

全局值(全局变量)是可以通过完全相同的名称从任何chart或子图表访问的值。全局值需要显示声明,不能将现有的非全局值作为全局值使用。

Values数据类型有一个名为 Values.global的保留部分,可以用来设置全局值。在 mychart/values.yaml 文件中设置一个全局值如下:

favorite:
  drink: coffee
  food: pizza
pizzaToppings:
  - mushrooms
  - cheese
  - peppers
  - onions

mysubchart:
  dessert: ice cream

global:
  salad: caesar

因为全局的工作方式,mychart/templates/configmap.yamlmysubchart/templates/configmap.yaml 都应该能通过 {{ .Values.global.salad }} 进行访问。

mychart/templates/configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  salad: {{ .Values.global.salad }}

**
mysubchart/templates/configmap.yaml:**

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-cfgmap2
data:
  dessert: {{ .Values.dessert }}
  salad: {{ .Values.global.salad }}

现在,如果我们运行一个试运行安装,我们将在两者的输出中看到相同的值:

# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: silly-snake-configmap
data:
  salad: caesar

---
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: silly-snake-cfgmap2
data:
  dessert: ice cream
  salad: caesar

全局值对于传递这样的信息很有用,但是需要一些计划来确保正确的模板配置为使用全局值。

5、与子chart共享模板

父chart和子chart可以共享模板。在任意chart中定义的块在其他chart中也是可用的。

比如,我们可以这样定义一个简单的模板:

{{- define "labels" }}from: mychart{{ end }}

回想一下模板标签时如何全局共享的。因此,labels chart可以包含在任何其他chart中。

虽然chart开发人员可以在 includetemplate 之间进行选择,但是使用 include 的一个优点是它可以动态引用模板:

{{ include $mytemplate }}

上述会取消对 $mytemplate 的引用,相反,template 函数只接受字符串字面量。

6、避免使用block

Go 模板语言提供了一个 block 关键字,允许开发人员提供一个默认的实现,这个实现稍后会被覆盖。在Helm chart中,block 不是重写的最佳工具,因为如果提供了同一个 block 的多个实现,则所选择的 block 是不可预测的。建议改为使用 include

0

评论区