首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >kubernetes-helm模板可以使用变量吗?

kubernetes-helm模板可以使用变量吗?
EN

Stack Overflow用户
提问于 2017-03-16 09:15:42
回答 2查看 15.4K关注 0票数 14

我有一个用于k8s资源的通用模板,我想将其扩展n倍(如果您很好奇,这是为了让我可以创建mongo集群的n个成员,它们使用statefulset资源,以便每个成员都有一个稳定的网络名称)。

显然,我每次在循环中都需要不同的值。我循环遍历了Sprig "until“函数生成的一系列索引。但是循环的$index没有在".“中设置。命名空间。因此,我无法在_helpers.tpl文件中引用我定义的模板中的当前迭代。

以下是一个包含完整k8s资源yaml的示例模板(我将其大部分内容缩写):

代码语言:javascript
复制
{{- define "mytest" -}} 
---
apiVersion: apps/v1beta1
kind: StatefulSet
  abbreviated...
  containers:
  - name: mongod-$index
  abbreviated...
{{- end -}}

呼叫者:

代码语言:javascript
复制
{{ range $index, $e := until .Values.mongod_count }}
    {{include "mytest" .}}
{{ end}}

我只得到:未定义的变量"$index“

我也尝试过使用块,像这样在我的(调用者)模板中:

代码语言:javascript
复制
{{ $foo := "somevalue" }}
{{ define "my_extra_labels" }} bla {{ .Values.test }}_{{$foo}}{{end}}
{{ template "mytest" . }}

在我的_helpers.tpl里有这个

代码语言:javascript
复制
{{/* Test stuff */}} 
{{- define "mytest" -}}
hello: world_how_are_{{ block "my_extra_labels" . }}{{ end }}
{{- end -}} 

变量$foo未在“定义”正文中定义。

这种模板作用域感觉如此严格,以至于在这一点上,我不知道如何使用它来解决我当前的场景。

有没有什么方法可以把变量塞进“。命名空间?如果是这样的话(祈祷),有没有办法以某种方式合并名称空间,以便仍然可以访问.Values和.Chart变量?

EN

回答 2

Stack Overflow用户

发布于 2017-08-11 06:29:37

helm中的模板不能访问变量。但是,传递给模板的上下文是一个字典。sprig库可以从Go模板中访问,并可用于操作字典。

使用这个简化的模板:

代码语言:javascript
复制
{{- define "mytest" -}} 
  - name: mongod-{{ .index }}
{{- end -}}

现在,您可以调用此模板作为示例:

代码语言:javascript
复制
{{ range $index := until 5 }}
  {{- $p := dict "index" $index }}
  {{include "mytest" $p}}
{{- end -}}

这将输出:

代码语言:javascript
复制
- name: mongod-0
- name: mongod-1
- name: mongod-2
- name: mongod-3
- name: mongod-4

您还可以将项目添加到现有或当前范围的字典中:

代码语言:javascript
复制
{{- $_ := set . "index" "none" }}
{{include "mytest" .}}

$_用于抑制不需要的输出,因为"set“返回新字典。以上返回:

代码语言:javascript
复制
- name: mongod-none

添加到字典中的任何值都将存在于调用之后。如果你想避免污染现有的字典,你可以使用以下命令强制进行深度复制:

代码语言:javascript
复制
{{-  $d := merge (dict) . -}}

添加到"$d“中的任何内容都不会存在于".”中。

票数 25
EN

Stack Overflow用户

发布于 2018-06-13 18:16:10

我之所以把这个留在这里,是因为有些人可能试图为Helm中的变量设置静态值,以便在模板中重用它,他们可能会通过标题找到这个问题。所以,这里有一个技巧:

更新:

有一个更好的方法可以做到这一点:

代码语言:javascript
复制
{{- $_ := set . "appName" "app_name_one"-}}

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

使用旧的建议(不要使用它)

结合@kscoder建议的上述答案中的语法

代码语言:javascript
复制
    ---
    # 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
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42823623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档