基于部署名称的 Helm 动态变量

Helm dynamic variable based on Deployment name

提问人:Vladyslav Avramenko 提问时间:11/14/2023 最后编辑:Vladyslav Avramenko 更新时间:11/15/2023 访问量:43

问:

我有这个 Helm 值:

applications_capacity:
  core:
    limit_cpu: 400m
    limit_memory: 512Mi
    request_cpu: 400m
    request_memory: 512Mi
  currency:
    limit_cpu: 400m
    limit_memory: 512Mi
    request_cpu: 400m
    request_memory: 512Mi

我正在尝试根据以下内容动态引用值:metadata.name

requests:
{{- $ := . -}}
{{- $app_name := .Release.Name }}
  memory: {{ (get $.Values.applications_capacity $app_name).request_memory }}

但有和错误:

Error: ... at <$app_name>: can't evaluate field request_memory in type string

我对表达式中的 Helm 表达式不是很熟悉,但即使是 ChatGPT-4 也没有多大帮助

尝试过 , , 表达式indexgetrange

kubernetes-helm 扩展

评论


答:

0赞 David Maze 11/15/2023 #1

get 扩展函数被记录为如果值不存在,则返回空字符串。模板代码的整体结构在我看来是正确的,但是如果不是值文件中列出的特定值之一,则几乎完全符合您描述的错误。.Release.Name

标准的 Go 文本/模板函数可能会返回更有用的错误,并且稍微紧凑一些index

memory: {{ index .Values.applications_capacity .Release.Name "request_memory" }}

我在这里考虑的另一种方法是为每个环境或部署使用一组不同的值,而不是尝试将不同的环境嵌入到单个统一文件中。例如,您可以有一个额外的文件

# values.core.yaml
applications_capacity:
  limit_cpu: 400m
  limit_memory: 512Mi
  request_cpu: 400m
  request_memory: 512Mi

并在安装图表时应用该值文件

helm install -f values.core.yaml not-necessarily-core .

然后,模板代码可以避免动态查找

memory: {{ .Values.applications_capacity.request_memory }}

并且您不会绑定到一组预先选择的有效 Helm 版本名称。

评论

0赞 Vladyslav Avramenko 11/15/2023
对于表达式,它返回: 关于不同的值 这是另一个很好的解决方案,但如果可能的话,我想保留当前的逻辑indexat <index .Values.applications_capacity .Release.Name "request_memory">: error calling index: index of nil pointer
0赞 David Maze 11/15/2023
这又是一个错误,无论你的 Helm 版本名称是什么,它都不存在于固定值文件中。
0赞 Vladyslav Avramenko 11/15/2023 #2

于是我回答了自己的问题:

{{- $app_name := "example" }}
resources:
   requests:
      memory: {{ index (index .Values.applications_capacity $app_name ) "limit_memory" }}
      cpu: {{ index (index .Values.applications_capacity $app_name ) "limit_cpu" }}
   limits:
      memory: {{ index (index .Values.applications_capacity $app_name ) "request_memory" }}
      cpu: {{ index (index .Values.applications_capacity $app_name ) "request_cpu" }}

需要使用 variable,因为 Helm 不能直接引用 “metadata.name”