如果值文件中提到的值(如果没有提到,我已经单独处理了)小于 5000m,我试图为 CPU 设置一个默认值。我正在尝试这个,但我认为我做得不对。 另外,如果我将默认值设置为 5000m,并且在我的值文件中提到它只是 5。它能够比较两者吗?
resources:
requests:
{{- if .Values.resources.requests.cpu }}
cpu: {{ .Values.resources.requests.cpu }}
{{- end }}
{{- if .Values.resources.requests.memory }}
memory: {{ .Values.resources.requests.memory }}
{{- end }}
limits:
{{- if ((( .Values.resources).limits).cpu) }}
cpu: {{ .Values.resources.limits.cpu }}
{{- else }}
{{- $limit_value := .Values.resources.requests.cpu | toString | regexFind "[0-9.]+" }}
{{- $limit_suffix := .Values.resources.requests.cpu | toString | regexFind "[^0-9.]+" }}
cpu: {{ mulf $limit_value 3 }}{{ $limit_suffix }} }}
{{- end }}
{{- if (((.Values.resources).limits).memory) }}
memory: {{ .Values.resources.limits.memory }}
{{- else }}
{{- $limit_val := .Values.resources.requests.memory | toString | regexFind "[0-9.]+" }}
{{- $limit_suff := .Values.resources.requests.memory | toString | regexFind "[^0-9.]+" }}
memory: {{ mulf $limit_val 3 }}{{ $limit_suff }}
{{- end }}
{{- end }}
您这里有两个不同的问题。 没有内置的方法来解析 Kubernetes 资源值,因此您必须做大量工作才能实际提供该默认值。
如果您只想提供默认值而不尝试检查最小值,那么您可以使用 Helm (Sprig)
default
函数:
resources:
requests:
cpu: {{ .Values.resources.requests.cpu | default "5000m" }}
最小界限会导致一些麻烦。 我不相信 Helm 中有一个函数可以解析
5000m
,或者将其与 5.0
进行比较。 您可以尝试使用 Helm 模板语法编写它,但这可能会变得很尴尬。
{{/* Convert a resource quantity like "5000m" to a base number like "5".
Call with the quantity string as the parameter, returns the number
as a string. */}}
{{- define "resource-quantity" -}}
{{- if . | hasSuffix "m" -}}
{{- $quantity = . | trimSuffix "m" | float64 -}}
{{- divf $quantity 10000000 -}}
{{- else -}}
{{ . }}
{{- end -}}
{{- end -}}
请注意,除了
m
之外,还有许多后缀,您可能也想处理这些后缀,也许使用字典结构。 我正在使用 Sprig 浮点数学函数,它应该包含在 Helm 中。 这个模板是实际的代码,您还想为其安排诸如测试之类的事情,而 Helm 对此支持不太好。
一旦你知道了,
gt
(大于)就是一个带有两个参数的函数。 您想要测试“是否存在”和“是否至少是这个最小值”,因此您必须重复该值。 对于像这样的长值,可以使用标准模板 with
运算符,它的作用类似于 if
指令,并且还临时将 .
变量重新绑定到您正在测试的值。
所以你可以写类似的东西
{{- with .Values.resources.requests.cpu -}}
{{- $quantity := include "resource-quantity" . | float64 }}
{{- if and . (gt $quantity 5.0) }}
cpu: {{ . }}
{{- else }}{{/* if */}}
cpu: 5000m
{{- end }}{{/* if */}}
{{- else }}{{/* with */}}
cpu: 5000m
{{- end }}{{/* with */}}
但是
with
已经测试该值是否非空,并且您可以使用 maxf
函数强制执行最小值。 所以(给定一个完整的工作测试resource-quantity
模板函数)你可以写:
resources:
requests:
{{- with .Values.resources.requests.cpu }}
cpu: {{ include "resource-quantity" . | float64 | maxf 5.0 }}
{{- else }}
cpu: 5.0
{{- end }}
这就是我如何进行比较的。以下是单位 m
之一的示例{{- if eq $limit_suffix "m" }}
cpu: {{ mulf $limit_value 3 | max 5000 }}{{$limit_suffix}}
{{- else }}
cpu: {{ mulf $limit_value 3 | max 5 }}
{{- end }}