带有 AND 运算符的 if 条件和 helm 中的大于条件

问题描述 投票:0回答:2

如果值文件中提到的值(如果没有提到,我已经单独处理了)小于 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
2个回答
3
投票

您这里有两个不同的问题。 没有内置的方法来解析 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 }}

0
投票

这就是我如何进行比较的。以下是单位 m

之一的示例
{{- if eq $limit_suffix "m" }}
        
        cpu: {{ mulf $limit_value 3 | max 5000 }}{{$limit_suffix}}
       {{- else }}
        cpu: {{ mulf $limit_value 3 | max 5 }}
     {{- end }}
© www.soinside.com 2019 - 2024. All rights reserved.