【问题标题】:helm chart - range on values-files by namehelm chart - 按名称显示值文件的范围
【发布时间】:2021-07-05 22:13:27
【问题描述】:

我有一个包含 3 个值文件的舵图:

值-版本1:

services:
  - name: service1
  - name: service2
  - name: service3

值-版本2:

services:
  - name: service4 
  - name: service5
  - name: service6

值-版本3:

services:
  - name: service7 
  - name: service8
  - name: service9

我通过 config-map 模板通过这些值文件创建了一个迭代:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-confmap
data:
    {{- range $service := .Values.services }}
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/{{ $service.name }}-*_platform*.log
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/{{ $service.name }}-*_infra*.log
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/{{ $service.name }}-*_other*.log

我正在寻找一种方法:

“values-version1”服务适合第一个输入

“values-version2”服务适合第二个输入

“values-version1”服务适合第三个输入

问题是所有文件列表名称都是“服务”,我不想更改列表名称。

是否有可以引用文件名的“if”语句?

【问题讨论】:

  • 您可以在您的值文件中添加另一个变量并在其中捕获文件名,然后在 if 语句中使用它吗?
  • 不确定你的意思。您能否发布答案或详细说明您的评论?

标签: kubernetes kubernetes-helm


【解决方案1】:

只是在评论中详细说明解决方案。本质上,为每个值文件添加另一个键值对,例如:

值-版本1:

valver: version1
services:
  - name: service1
  - name: service2
  - name: service3

值-版本2:

valver: version2
services:
  - name: service4 
  - name: service5
  - name: service6

值-版本3:

valver: version3
services:
  - name: service7 
  - name: service8
  - name: service9

最后你的模板变成这样:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-confmap
data:
    {{- range $service := .Values.services }}
    {{- if eq $.Values.valver "version1" }}   
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/{{ $service.name }}-*_platform*.log
    {{- else if eq $.Values.valver "version2" }} 
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/{{ $service.name }}-*_infra*.log
    {{- else if eq $.Values.valver "version3" }} 
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/{{ $service.name }}-*_other*.log
    {{- end }} 
    {{- end }} 

请注意,在您的具体问题情况下,我会完全摆脱 is 声明,而是放入不同之处 - 例如 otherplatforminfra em> 在新变量中。但是,仍然发布完整的解决方案,因为您可能在理论上存在其他不属于问题的差异。

看起来像这样 - 值文件:

值-版本1:

infratype: other
services:
  - name: service1
  - name: service2
  - name: service3

值-版本2:

infratype: platform
services:
  - name: service4 
  - name: service5
  - name: service6

值-版本3:

infratype: infra
services:
  - name: service7 
  - name: service8
  - name: service9

模板:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-confmap
data:
    {{- range $service := .Values.services }}
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/{{ $service.name }}-*_{{ $.Values.infratype }}*.log
    {{- end }} 

【讨论】:

  • 谢谢。我实现了它,当我做 helm 模板时,我也在平台内获得 version2 和 version3 值。你在本地试过吗?
  • 尚未测试过这个确切的解决方案,但有一个类似的解决方案可以正常工作。同样,如果以上是您的确切情况,我建议创建一个变量来获取值 platform|infra|other 并使用该内联而不是使用 if 语句。
  • 恐怕我还没收到,抱歉。变量应该在哪里取值?您所说的“在线使用”是什么意思?如果您编辑答案,将不胜感激。再次感谢!
  • 我认为因为 helm 不考虑 values-files 名称,并且因为在所有 values-files 中列表的名称都相同,所以 helm 会考虑第一个服务列表,然后将其覆盖到第二个服务列表,然后是第三个。也许我应该从“if”语句或其他内容中更改列表的名称?
  • 添加了没有 if 的解决方案。如果这仍然不起作用,请在 github 上创建示例 repo / gist,展示如何重现您的问题。原始解决方案也应该可以工作,但您可能会以某种方式混合值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
相关资源
最近更新 更多