我有这个 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
并且我正在尝试基于
.Release.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
表达式
get
扩展函数被记录为如果值不存在则返回空字符串。您的模板代码的整体结构对我来说看起来是正确的,但如果 .Release.Name
不是值文件中列出的特定值之一,您将得到与您所描述的几乎完全相同的错误。
text/template
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 版本名称的束缚。