Helm 图表将值从主图表传播到子图表

问题描述 投票:0回答:1

我有一个包含多个子图表的图表,这些子图表都应使用与主图表相同的注释,并且我只想在我的主图表中定义一次所述注释

values.yaml
。据我了解,
_helpers.tbl
中定义的函数也可供子图使用。不过,我无法进行设置以将注释传播到子图中。

以下是相关片段:

# Source: mainchart/values.yaml
serviceAnnotations: 
  propagated: "true"
...


---
# Source: mainchart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations: 
  {{- include "automate.annotations" . | nindent 4 }}
...


---
# Source: mainchart/templates/_helpers.tbl
{{/*
Global annotations
*/}}
{{- define "automate.annotations" -}}
{{- with .Values.serviceAnnotations }}
  {{- toYaml . }}
{{- end }}
{{- end }}
...


---
# Source: mainchart/charts/subchart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations: 
  {{- include "automate.annotations" . | nindent 4 }}
...


通过以下方式检查填充的图表:

helm install mainchart mainchart/ --dry-run
kubernetes kubernetes-helm
1个回答
0
投票

当您

define
辅助模板时,它采用单个参数,就像其他编程语言中的函数一样。在模板代码中,
.
指的是模板参数,
.Values
是该模板参数中名为
Values
的字段。

这样做的重要后果是,

define
d 模板不会“捕获”其定义的上下文。您从两个不同的地方调用 (
include
) 模板两次。在这两种情况下,您都传递
.
作为参数。在主图表中,
.
是顶级 Helm 对象,但在子图表中,它的范围已经限定为仅包含子图表的值;即使您正在调用顶级图表中定义的模板,您也无法返回顶级值。

Helm 为您提供的一种机制是 全局图表值

.Values.global
会原封不动地传播到所有子图表中。如果你在助手中使用这个

{{- define "automate.annotations" -}}
{{- toYaml .Values.global.serviceAnnotations }}
{{- end }}

并移动主

values.yaml
文件中的定义

# Source: mainchart/values.yaml
global:
  serviceAnnotations: 
    propagated: "true"

它就会有你想要的效果。

© www.soinside.com 2019 - 2024. All rights reserved.