web-dev-qa-db-ja.com

kubernetes-helmテンプレートは変数を使用できますか?

N倍に拡張したいk8sリソースの汎用テンプレートがあります(好奇心が強い場合は、mongoクラスターのnメンバーを作成でき、statefulsetリソースを使用して、各メンバーが安定したネットワークを持つようにします名前)。

明らかに、ループを通して毎回異なる値が必要です。 Sprigの「until」関数によって生成された一連のインデックスをループしています。ただし、ループの$ indexは「。」に設定されません。名前空間。そのため、_helpers.tplファイルで定義したテンプレート内の現在のイテレーションを参照できません。

以下は、完全なk8sリソースyamlを含むテンプレートの例です(私はそのほとんどを省略しています)。

{{- define "mytest" -}} 
---
apiVersion: apps/v1beta1
kind: StatefulSet
  abbreviated...
  containers:
  - name: mongod-$index
  abbreviated...
{{- end -}}

発信者:

{{ range $index, $e := until .Values.mongod_count }}
    {{include "mytest" .}}
{{ end}}

私はただ得る:未定義の変数「$ index」

私も(呼び出し元)テンプレートで次のようにブロックを試しました:

{{ $foo := "somevalue" }}
{{ define "my_extra_labels" }} bla {{ .Values.test }}_{{$foo}}{{end}}
{{ template "mytest" . }}

そして、これは私の_helpers.tplにあります

{{/* Test stuff */}} 
{{- define "mytest" -}}
hello: world_how_are_{{ block "my_extra_labels" . }}{{ end }}
{{- end -}} 

変数$ fooは、 "define"本文で定義されていません。

このテンプレートのスコープは非常に制限的であるように感じられるので、現時点では、現在のシナリオを解決するためにそれを使用する方法がわかりません。

変数を「。」に入れる方法はありますか?名前空間?もしそうなら(指を交差させて)、名前空間を何らかの方法でマージして、.Valuesと.Chart変数に引き続きアクセスできるようにする方法はありますか?

10
rideswitch

Helmのテンプレートは変数にアクセスできません。ただし、テンプレートに渡されるコンテキストは辞書です。 SprigライブラリはGoテンプレート内からアクセスでき、辞書の操作に使用できます。

この簡略化されたテンプレートを見てみましょう:

{{- define "mytest" -}} 
  - name: mongod-{{ .index }}
{{- end -}}

これで、例としてこのテンプレートを呼び出すことができます。

{{ range $index := until 5 }}
  {{- $p := dict "index" $index }}
  {{include "mytest" $p}}
{{- end -}}

これは出力します:

- name: mongod-0
- name: mongod-1
- name: mongod-2
- name: mongod-3
- name: mongod-4

既存または現在のスコープ辞書にアイテムを追加することもできます。

{{- $_ := set . "index" "none" }}
{{include "mytest" .}}

$ _は、 "set"が新しいディクショナリを返すときに不要な出力を抑制するために使用されます。上記は戻ります:

- name: mongod-none

辞書に追加された値は、呼び出しを超えて存続します。既存の辞書の汚染を避けたい場合は、次のコマンドを使用してディープコピーを強制できます。

{{-  $d := merge (dict) . -}}

「$ d」に追加されたものは、「。」には存在しません。

15
kscoder

Helmの変数に静的な値を設定してテンプレートで再利用しようとしている可能性があり、おそらくタイトルSOの質問を見つけるでしょう。だから、ここにトリックがあります:

更新:

これを行うより良い方法があります:

{{- $_ := set . "appName" "app_name_one"-}}

---
apiVersion: v1
kind: Deployment
apiVersion: apps/v1beta2
metadata:
  name: {{ .appName }}

古いアドバイス(使用しないでください)

@kscoderによって提案された上記の回答の構文と組み合わせる

    ---
    # values.yml

    static_vars:
      app_name_one: app_name_one
      text_to_reuse: text_to_reuse

    ---    
    # templates/deployment.yml

    # now you don't need to copy-n-paste values, just set them here once
    {{- $text_to_reuse := index .Values "static_vars" "text_to_reuse" -}}
    {{- $app_name := index .Values "static_vars" "app_name_one" -}}
    {{- $_ := set . "app_name" $app_name -}}

    apiVersion: v1
    kind: Deployment
    apiVersion: apps/v1beta2
    metadata:
      name: {{ .app_name }}
    spec:
      selector:
        # https://github.com/kubernetes/kubernetes/issues/26202
        matchLabels:
          name: {{ .app_name }}
      template:
        metadata:
          labels:
            name: {{ .app_name }}
            name_alt: {{ $app_name }}
            other_label: {{ $text_to_reuse }}
    # and so on
3
kivagant