用 Helm 压平字典

Flatten Dictionary with Helm

有没有办法用 helm 压平字典?我想通过展平位于 values.yaml 中的 YAML 配置来为图表中的应用程序提供环境变量。配置看起来像。 (不实际)

config:
 server:
  port: 3333
 other:
  setting:
    name: test

并希望提供环境变量作为

- name: CONFIG_SERVER_PORT
  value: 3333
- name: CONFIG_OTHER_SETTING_NAME
  value: test

我考虑过使用 Kubernetes 配置映射,但这意味着使用随机版本名称部署略有不同的应用程序实例,这样配置就不会被覆盖。 这个库 https://github.com/jeremywohl/flatten 提供了一种用分隔符来扁平化 map[string]interface{} 的方法。有没有办法为使用该库的 helm 提供自定义管道或其他方式来展平配置?

可能不会。您也许可以使用一些 Sprig 函数和大量局部变量在纯 Gotpl 中实现它,但是……不要。您不能在不重新编译的情况下向 Helm 添加自定义功能。直接使用原生格式即可。

你问的问题是可以的。附近没有资源。 但尝试这样的事情。

// chart

apiVersion: apps/v1beta1
kind: Deployment
spec:
  template:
    spec:
      containers:
        - name: {{ template "name" . }}          
          command: [{{ range $i, $e := .Values.container.command }}{{ if $i }}, {{$e|quote}}{{else}}{{$e|quote}}{{end}}{{end}}]          
          env:
          {{- range .Values.container.env }}
            - name: {{ .name }}
              value: "{{ .value }}"
          {{- end }}


// values

container:  
  command: ["cmd", "sub_cmd", "sub_sub_cmd"]    
  env:
      - name: CONFIG_SERVER_PORT
      value: 3333
      - name: CONFIG_OTHER_SETTING_NAME
      value: test

我不知道有什么内置的东西。Sprig provides most of the useful functions for helm templates but the dict functions 只介绍原语。

您可以 define 一个 named template 执行业务并递归配置 dict/map。然后 include 需要的模板:

{{- define "recurseFlattenMap" -}}
{{- $map := first . -}}
{{- $label := last . -}}
{{- range $key, $val := $map -}}
  {{- $sublabel := list $label $key | join "_" | upper -}}
  {{- if kindOf $val | eq "map" -}}
    {{- list $val $sublabel | include "recurseFlattenMap" -}}
  {{- else -}}
- name: {{ $sublabel | quote }}
  value: {{ $val | quote }}
{{ end -}}
{{- end -}}
{{- end -}}

这里通过 list 传递 config 数据有点复杂,然后将其分离回 $map$label。这是因为模板只接受单个变量 scope.

env: {{ list .Values.config "CONFIG" | include "recurseFlattenMap" | nindent 2 }}   

使用示例值:

config:
  server:
    port: 3333
  first: astr
  other:
    setting:
      name: test

结果

$ helm template . 
---
# Source: so61280873/templates/config.yaml
env: 
  - name: "CONFIG_FIRST" 
    value: "astr"
  - name: "CONFIG_OTHER_SETTING_NAME" 
    value: "test"
  - name: "CONFIG_SERVER_PORT" 
    value: "3333"

可能不完美:

{{- range $key, $value := (regexReplaceAll ":\n(  )+" (toYaml .Values) "_" | fromYaml) }}
{{ printf "- %s: %s" $key $value }}
{{- end }}

其中 .Values 的形式为

values:
- key:
    subKey: value
- key
    subKey2: value2

我想要

- key_subkey: value
- key2_subKey2: value2

具体来说,这是因为使用 helmfile 将多个单独的 helm 图表管理为一个精心策划的命令,希望将环境值折叠到一个 configmap 图表中,这样 pods 可以 envFrom.configMapRef 加载环境配置helmfile 作为环境变量