【问题标题】:how can i reference the namespace in values.yaml?如何引用 values.yaml 中的命名空间?
【发布时间】:2019-12-29 04:51:55
【问题描述】:

我希望能够引用values.yaml 中的当前命名空间,以使用它来为类似这样的一些值添加后缀

# in values.yaml
someParam: someval-{{ .Release.Namespace }}

以这种方式定义它而不是进入我的所有模板并添加{{ .Release.Namespace }} 会更好。如果我可以在values.yaml 中做到这一点,那就更清楚了,只需要在一个地方定义。

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    您可以使用named templates 来定义可重复使用的帮助模板。例如

    templates/_helpers.tpl:

    {{- define "myChart.someParam" -}}someval-{{ .Release.Namespace }}{{- end -}}
    

    templates/configmap.yaml(例如):

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: something
    data:
      foo: {{ template "myChart.someParam" . }}
    

    结果:

    $ helm template . --namespace=bar
    ---
    # Source: helm/templates/configmap.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: something
    data:
      foo: someval-bar
    

    【讨论】:

    • 这是我想要避免的。必须更新我的所有模板才能使用.Release.Namespace。这也意味着图表正在做一些不那么清晰的魔法。我想从 values.yaml 中传递完整的值,以便它在配置中可见该值是什么 - 而不是在我的所有模板中动态创建它
    • “值文件是纯 YAML 文件”[source]。所以我相信你的values.yaml 中不能有任何类型的模板或插值。
    • 使用我的解决方案,您无需更新所有模板以拥有{{ .Release.Namespace }}。但是,是的,在我的解决方案中,图表正在发挥“一些魔力”,如果没有看到呈现的模板,它就不会可见。
    【解决方案2】:

    如果您知道 someParam 可能包含模板构造,Helm 包含一个解释它的 tpl 函数。

    - name: SOME_VARIABLE
      value: {{ .Values.someParam | tpl }}
    

    如果图表允许这样做,它通常会记录下来。作为一个具体的例子,helm/charts PostgreSQL chart 记录了它的configurationConfigMap 设置是

    带有 PostgreSQL 配置文件的 ConfigMap(注意:覆盖 postgresqlConfigurationpgHbaConfiguration)。 该值被评估为模板。

    因此,对于该特定值,您可以将模板宏放入 values.yaml 文件中。

    【讨论】:

    • 我正在写我自己的图表。 tpl 是否仅在 values.yaml 中可用?还是您必须做一些事情才能完成这项工作。 values.yaml 不是模板,那么如何在其中访问 tpl?
    • 如果我这样做,这将获得命名空间someParam: someval-{{ .Release.Namespace | tpl }}
    • 嗯,那么这如何回答我的问题?也许我在这里很笨,不知道如何使用它来获取命名空间
    • 你的意思是它在我所有的模板中使用它的地方?这与在我的模板中使用 {{ .Release.Namespace }} 有何不同?
    • 当我部署它时,如果我不想包含命名空间并喜欢不同的约定,我可以helm install --set someParam='{{ .Chart.Name }}-{{ .Release.Name }}-someval'。 (但是,是的,您需要在每次使用时或在共享助手中调用 tpl 才能导致扩展发生。)
    【解决方案3】:

    澄清一下:

    正如社区所述:Amit Kumar GuptaDavid Maze 没有很好的解决方案,helm 原生支持以在不修改模板的情况下更改此行为。 看起来在您的情况下(不修改 helm 模板)最好的解决方案就是在 helm install 期间使用 set 和参数。

    喜欢:

    helm install --set foo=bar --set foo=newbar ./redis
    

    【讨论】:

      【解决方案4】:

      在 github 上有一个关于你所要求的提案:Proposal: Allow templating in values.yaml

      来自最新的 cmets 之一:

      这是我遇到的第一个线程,而不是在这里发表评论...... 另见#2514

      :) 值得庆幸的是,最新的 Helm 手册说明了如何实现这一点。 https://helm.sh/docs/howto/charts_tips_and_tricks/#using-the-tpl-function

      诀窍是在 " 或 yaml 块 |- 中包含变量,然后 在模板中将其引用为 {{ tpl .Values.variable . }} 这 似乎让 Helm 很高兴。

      例子:

      $ cat Chart.yaml | grep appVersion appVersion: 0.0.1-SNAPSHOT-d2e2f42
      
      
      $ cat platform/shared/t/values.yaml | grep -A2 image: image:    tag:
      |-
          {{ .Chart.AppVersion }}
      
      
      $ cat templates/deployment.yaml | grep image:
                image: "{{ .Values.image.repository }}:{{ tpl .Values.image.tag . }}"
      
      
      $ helm template . --values platform/shared/t/values.betradar.yaml |
      grep image
                image: "docker-registry.default.svc:5000/namespace/service:0.0.1-SNAPSHOT-d2e2f42"
                imagePullPolicy: Always
            image: busybox 
      

      否则会抛出错误..

      $ cat platform/shared/t/values.yaml | grep -A1 image: image:    tag:
      {{ .Chart.AppVersion }}
      
      1 $ helm template . --values platform/shared/t/values.yaml | grep
      image Error: failed to parse platform/shared/t/values.yaml: error
      converting YAML to JSON: yaml: invalid map key: map[interface
      {}]interface {}{".Chart.AppVersion":interface {}(nil)}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-11
        • 1970-01-01
        • 2019-07-06
        • 2014-10-15
        • 2011-07-27
        相关资源
        最近更新 更多