Kubernetes helm configmap在values.yaml中包含客户端脚本

Kubernetes helm configmap在values.yaml中包含客户端脚本,kubernetes,kubernetes-helm,Kubernetes,Kubernetes Helm,我必须将客户端脚本文件作为configmap包含在内,并装载到pod中,以了解如何在values.yaml中为下面的结构创建configmap app: server: client-cli1.sh: | #!/bin/bash echo "Hello World" client-cli2.sh: | #!/bin/bash echo "Hello World" 这是配置映射文件 apiVersion: v1 kind: Co

我必须将客户端脚本文件作为configmap包含在内,并装载到pod中,以了解如何在values.yaml中为下面的结构创建configmap

app:
  server:
    client-cli1.sh: |
      #!/bin/bash
      echo "Hello World"
    client-cli2.sh: |
      #!/bin/bash
      echo "Hello World"
这是配置映射文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: cli-config
data: 
{{ range  $key, $val:= .Values.app.server }}
  {{ $key }}: |
    {{ $val  }}
{{ end }}
我收到错误“将YAML转换为JSON时出错:YAML:第14行:找不到预期的':'” 注意:不能更改结构,也不能使用文件功能,因为生成发生在其他地方,只提供values.ymal

如何解析此项。

尝试以下操作:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cli-config
data: 
{{ toYaml .Values.app.server | indent 2 }}

您可以将
头盔模板
与相同的
-f
-set
标志一起使用,以查看模板的输出。这是调试这类问题的关键,您可以在继续阅读之前尝试一下,以了解出了什么问题以及是否已修复

Kubernetes使用的YAML文件对缩进非常敏感。Helm的Go文本/模板引擎并不特别了解YAML结构。您可能会看到,脚本第二行的
echo
根本没有缩进,这违反了YAML的缩进规则

有两个答案:

  • 使用template函数缩进正在注入的内容的整个主体。请注意,这包括第一行,因此不需要在YAML模板中缩进该行

    data: 
    {{ range  $key, $val:= .Values.app.server }}
      {{ $key }}: |
    {{ $val | indent 4 }}
    {{ end }}
    
  • 赫尔姆已经死了。特别是,您可以使用
    toJson
    将字符串转换为JSON字符串,包括转义换行等细节。YAML 1.2旨在成为JSON的超集,因此应该可以:

    data: 
    {{ range  $key, $val:= .Values.app.server }}
      {{ $key }}: {{ $val | toJson }}
    {{ end }}
    
    因此,您可以使用
    toYaml
    让Helm为您完成艰苦的工作:

    data:
    {{ .Values.app.server | toYaml | indent 2 }}
    

  • 使用
    helm template
    进行检查,以确保这些输出符合您的预期。第一个选项将生成更可读的ConfigMap YAML;第二种是更简洁的模板;但两者应该是等效的。

    当我运行第一行时,并没有在添加的地方只添加echo语句。这是因为#被认为是values.yaml中的注释?“内容可以安全地以选项卡或“#”字符开头。”