[Helm入門] Templateで使える関数の実行例 ~ 計算編 ~

Helmのテンプレートで計算の関数を使っていますか?

HelmはKubernetes用のパッケージ管理ソフトウェアです。HelmはChartと呼ばれる設計図をもとに、Kubernetesのマニフェストを作成し、パッケージをインストールします。ChartはGoのテンプレートを利用していて、Sprigの関数を利用することができます。本記事ではHelmテンプレートでのSprig関数のうち、算術関数の使用例を紹介します。

TL;DR

  • Sprigの算術関数ドキュメント
  • 一部の関数を除きint64型として計算されます。
  • 切り捨て、切り上げ、四捨五入の桁数調整の関数は、float型として扱われます。
  • helm install --dry-run --debug <chart>コマンドを使うことで、Kubernetesにインストールしないで関数の結果を知ることができます。

目次

検証環境

以下の実行例の動作環境です。

$ helm version --short
Client: v2.13.1+g618447c
Server: v2.13.1+g618447c

事前準備

検証用のHelmチャートを作成します。

  1. helm createコマンドでチャートのひな形を作成します。
  2. rmコマンドで不要なファイルを削除します。
  3. 検証のYAMLファイルを作成します。今回はConfigMapを作成するYAMLを作成しています。
  4. helm install --dry-run --debugコマンドで実行確認をします。--dry-run オプションを利用することで、Kuernetes上にConfigMapのリソースをインストールしないで、実行結果の確認を行うことができます。
$ helm create sprig
$ rm -rf sprig/templates/*
$ rm -rf sprig/values.yaml
$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: {{ .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: Hello World!
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: Hello World!

Math Functions

sprigの算術関数は一部の関数を除き、int64型として計算されます。floatの値を入力してもint64に変換されるので注意してください。

add

addは、加算(足し算)を行います。2つ以上のパラメータを渡すことができます。以下の例ではパラメータを3つ渡して、3つの数値の合計を表示しています。入力値としてfloat型の値を渡していますが、int64型として計算されることに注意してください。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: {{ printf "%s + %s + %s = %s" .Values.myvalue1 .Values.myvalue2 .Values.myvalue3 (add .Values.myvalue1 .Values.myvalue2 .Values.myvalue3) }}
  int64: {{ printf "%f + %f + %f= %d" .Values.myvalue1 .Values.myvalue2 .Values.myvalue3 (add .Values.myvalue1 .Values.myvalue2 .Values.myvalue3) }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue1: 1.5
myvalue2: 2.6
myvalue3: 3.7
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: %!!(MISSING)s(float64=1.5) + %!!(MISSING)s(float64=2.6) + %!!(MISSING)s(float64=3.7) = %!!(MISSING)s(int64=6)
  int64: 1.500000 + 2.600000 + 3.700000= 6

add1

add1は、インクリメンタル+1を行います。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: {{ .Values.myvalue }}
  myvalue2: {{ add1 .Values.myvalue }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue: 1
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue1: 1
  myvalue2: 2

sub

subは、2つの数の減算(引き算)を行います。addとは異なりsubはパラメータを2つまでしか渡せないところに注意してください。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  int64: {{ printf "%f - %f= %d" .Values.myvalue1 .Values.myvalue2 (sub .Values.myvalue1 .Values.myvalue2) }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue1: 3.3
myvalue2: 2.2
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  int64: 3.300000 - 2.200000= 1

div

divは、除算(割り算)を行います。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  int64: {{ printf "%f / %f= %d" .Values.myvalue1 .Values.myvalue2 (div .Values.myvalue1 .Values.myvalue2) }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue1: 6.3
myvalue2: 2.2
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  int64: 6.300000 / 2.200000= 3

mod

modは、剰余演算(除算の余り)を行います。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  int64: {{ printf "%f / %f= %d ... %d" .Values.myvalue1 .Values.myvalue2 (div .Values.myvalue1 .Values.myvalue2) (mod .Values.myvalue1 .Values.myvalue2) }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue1: 5.5
myvalue2: 2.2
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  int64: 5.500000 / 2.200000= 2 ... 1

mul

mulは、乗算(掛け算)を行います。2つ上のパラーメータを渡すことができます。以下の例では3つの数の乗算を行っています。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  int64: {{ printf "%f * %f * %f = %d" .Values.myvalue1 .Values.myvalue2 .Values.myvalue3 (mul .Values.myvalue1 .Values.myvalue2 .Values.myvalue3) }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue1: 2.2
myvalue2: 3.3
myvalue3: 4.4
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  int64: 2.200000 * 3.300000 * 4.400000 = 24

max

maxは、与えられた数値の中で最大のものを返します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  int64: {{ printf "%f, %f, %f: max %d" .Values.myvalue1 .Values.myvalue2 .Values.myvalue3 (max .Values.myvalue1 .Values.myvalue2 .Values.myvalue3) }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue1: 2.2
myvalue2: 3.3
myvalue3: 4.4
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  int64: 2.200000, 3.300000, 4.400000: max 4

min

minは、与えられた数値の中で最小のものを返します。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  int64: {{ printf "%f, %f, %f: min %d" .Values.myvalue1 .Values.myvalue2 .Values.myvalue3 (min .Values.myvalue1 .Values.myvalue2 .Values.myvalue3) }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue1: 2.2
myvalue2: 3.3
myvalue3: 4.4
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  int64: 2.200000, 3.300000, 4.400000: min 2

floor

floorは入力されたfloat型の数値から、小数点以下を切り捨てます。floorの戻り値はfloat型になります。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: {{ printf "%s -> floor: %s" .Values.myvalue1 (floor .Values.myvalue1) }}
  float: {{ printf "%f -> floor: %f" .Values.myvalue1 (floor .Values.myvalue1) }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue1: 12.345
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: %!!(MISSING)s(float64=12.345) -> floor: %!!(MISSING)s(float64=12)
  float: 12.345000 -> floor: 12.000000

ceil

ceilは、入力されたfloat型の数値から、小数点以下を切り上げます。ceilの戻り値はfloat型になります。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  float: {{ printf "%f -> floor: %f" .Values.myvalue1 (ceil .Values.myvalue1) }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue1: 12.345
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  float: 12.345000 -> floor: 13.000000

round

roundは、指定した値で小数部の桁数を四捨五入します。roundの戻り値はfloat型になります。

roundには、四捨五入対象の数値と小数点以下の桁数のパラメータが必要です。以下の例では小数点以下2桁まで表示(3桁目で四捨五入)をする例です。

$ cat << EOF > sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  float: {{ printf "%f -> floor: %f" .Values.myvalue1 (round .Values.myvalue1 2) }}
  float: {{ printf "%f -> floor: %f" .Values.myvalue2 (round .Values.myvalue2 2) }}
EOF
$ cat << EOF > sprig/values.yaml
myvalue1: 12.345
myvalue2: 54.321
EOF
$ helm install --dry-run --debug ./sprig
...省略...
---
# Source: sprig/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  float: 12.345000 -> floor: 12.350000
  float: 54.321000 -> floor: 54.320000

おわりに

本記事ではHelmテンプレートでのSprig関数のうち、算術計算の使用例を紹介しました。切り捨てや切り上げなど桁数調整の関数を除き、計算や結果はint64型で行われることに注意してください。

 

EasyDoggie

投稿者プロフィール

石川 淳
スカイアーチネットワークスで、新しいサービスの企画を行っています。
元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。
https://github.com/easydoggie
コメントを頂けると嬉しいです。

ABOUTこの記事をかいた人

スカイアーチネットワークスで、新しいサービスの企画を行っています。 元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。 https://github.com/easydoggie コメントを頂けると嬉しいです。