提问人:Vladyslav Avramenko 提问时间:11/14/2023 最后编辑:Vladyslav Avramenko 更新时间:11/15/2023 访问量:43
基于部署名称的 Helm 动态变量
Helm dynamic variable based on Deployment name
问:
我有这个 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 也没有多大帮助
尝试过 , , 表达式index
get
range
答:
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
对于表达式,它返回: 关于不同的值 这是另一个很好的解决方案,但如果可能的话,我想保留当前的逻辑index
at <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”
评论