0

我们使用 helm 图表部署到 Kubernetes 并使用 helm 生成这些图表。不幸的是,我不熟悉 helm 或 helm 模板(并且只对 kubernetes 有一定的了解)所以在问下面的问题时我可能使用了不正确的术语(实际上我可能已经在本段中做过)所以请耐心等待我得到加快速度。

我有一个 helm 模板 foo.yaml,它类似于以下内容:

{{- define "env.variables" }}
  echo "--- Setting env variables ---"

  export foo={{ .Values.global_vars.foo }}
{{- end }}
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: "{{ .Values.global_vars.bar }}-set-env-vars"
data:
  set-env-vars.sh: {{ include "env.variables" . | b64enc }}

如您所见,它定义了一个创建一些环境变量的脚本。我正在研究仅在某些条件为真时创建那些变量的要求(.Values.global_vars.baz == 1

我想我可以通过执行以下操作来实现这一点:

{{- define "env.variables" }}
  if [ {{ .Values.global_vars.baz }} = 1 ]
  then
    echo "--- Setting env variables ---"

    export foo={{ .Values.global_vars.foo }}
  fi
{{- end }}
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: "{{ .Values.global_vars.bar }}-set-env-vars"
data:
  set-env-vars.sh: {{ include "env.variables" . | b64enc }}

但这感觉不是一种非常优雅的方式。我可以将条件表达式放入data仅包含满足条件的脚本中。像这样的东西:

{{- define "env.variables" }}
  echo "--- Setting env variables ---"

  export foo={{ .Values.global_vars.foo }}
{{- end }}
{{- define "no.env.variables" }}
  echo "--- No env variables to set ---"
{{- end }}
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: "{{ .Values.global_vars.bar }}-set-env-vars"
data:
  set-env-vars.sh: {{ if {{ .Values.global_vars.bar }} = 1 then include "env.variables" else include "no.env.variables" . | b64enc }}

希望这是有道理的。这实际上是我第一次去掌舵,所以我正在寻找一些菜鸟指导。

4

1 回答 1

4

helm 文件中花哨的{{ }}东西是GO 模板。它们有几个内置特性,其中之一是控制结构,如 if-else。它们允许您有条件地渲染模板的一部分。

您可以向env.variables 命名模板添加条件:

{{ define "env.variables" }}
  {{ if eq .Values.global_vars.baz "1" }}
  echo "--- Setting env variables ---"

  export foo={{ .Values.global_vars.foo }}
  {{ else }}
  echo "--- No env variables to set ---"
  {{ end }}
{{ end }}
data:
  set-env-vars.sh: {{ include "env.variables" . | b64enc }}

set-env-vars.sh值:

{{- define "env.variables" }}
  echo "--- Setting env variables ---"

  export foo={{ .Values.global_vars.foo }}
{{- end }}
{{- define "no.env.variables" }}
  echo "--- No env variables to set ---"
{{- end }}
data:
  set-env-vars.sh: {{ if eq .Values.global_vars.baz "1" }} 
    {{- include "env.variables" . | b64enc }}
  {{- else }}
    {{- include "env.variables" . | b64enc }}
  {{- end }}

效果是一样的。

一个令人困惑的事情可能是if eq .Values.global_vars.baz "1"语法。是一个函数,下eq一个值是它的参数(GO 模板没有等号运算符)。

于 2020-10-16T19:07:14.600 回答