Helm 模板浮点运算

Cal*_*ton 5 go-templates kubernetes kubernetes-helm

$ helm version
version.BuildInfo{Version:"v3.3.0", GitCommit:"8a4aeec08d67a7b84472007529e8097ec3742105", GitTreeState:"dirty", GoVersion:"go1.14.6"}
Run Code Online (Sandbox Code Playgroud)

所以我有我的模板:

$ helm version
version.BuildInfo{Version:"v3.3.0", GitCommit:"8a4aeec08d67a7b84472007529e8097ec3742105", GitTreeState:"dirty", GoVersion:"go1.14.6"}
Run Code Online (Sandbox Code Playgroud)

值.yaml:

  minAvailable: {{ mul .Values.autoscaling.minReplicas 0.75 }}
Run Code Online (Sandbox Code Playgroud)

我本来期望渲染输出为2.25,但我得到 0 (3 * 0因为0.75被压倒了......)

我尝试过类似的事情

autoscaling:
  minReplicas: 3
Run Code Online (Sandbox Code Playgroud)

最终我要floor返回一个 int 的值...

  minAvailable: {{ mul (float .Values.autoscaling.minReplicas) 0.75 }}
Run Code Online (Sandbox Code Playgroud)

但我只是不明白为什么我似乎不能做简单的浮点算术


我尝试过的其他事情

  minAvailable: {{ floor ( mul .Values.autoscaling.minReplicas 0.75 ) }}
Run Code Online (Sandbox Code Playgroud)
  minAvailable: {{ float64 .Values.autoscaling.minReplicas }} 
Run Code Online (Sandbox Code Playgroud)

没有任何东西产生浮点数......

我什至尝试在 value.yaml 中执行此操作

autoscaling:
  minReplicas: 3.0
Run Code Online (Sandbox Code Playgroud)

Str*_*dic 11

Helm 及其模板支持默认的 Go文本/模板功能以及Sprig扩展提供的功能。从 Sprig 版本3.2开始,它还支持Float Math 函数,addf、、 、 等。在您的情况下subf,您只需要:mulfdivf

  minAvailable: {{ mulf .Values.autoscaling.minReplicas 0.75 }}
Run Code Online (Sandbox Code Playgroud)


Dav*_*aze 8

这些算术函数不是核心 Go文本/模板语言的一部分。它们来自Helm 包含的一个名为Sprig的有用扩展包。特别是,其数学函数的文档位于页面顶部

int64除非另有说明,所有数学函数都对值进行运算。

x * 0.75您可以计算整数,而不是尝试计算浮点数x * 3 / 4。将其分解为(x * 3) / 4,您可以将其作为相当精确的整数算术来执行:

minAvailable: {{ div (mul .Values.autoscaling.minReplicas 3) 4 }}
Run Code Online (Sandbox Code Playgroud)


Cal*_*ton 3

Pod 中断预算实际上采用百分比......

所以可以做

  minAvailable: "66%" # 2/3
Run Code Online (Sandbox Code Playgroud)

或者

  minAvailable: "75%" # 3/4
Run Code Online (Sandbox Code Playgroud)

来自文档:

如果您有 7 个 Pod,并且将 minAvailable 设置为“50%”,那么这是否意味着 3 个 Pod 或 4 个 Pod 必须可用并不是立即显而易见的。Kubernetes 向上舍入到最接近的整数,因此在这种情况下,必须有 4 个 Pod 可用。

所以本质上,66%of 3is1.98所以将被四舍五入为2