首页 > 解决方案 > 用 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提供了一种用分隔符展平 a 的方法map[string]interface{}。有没有办法为使用库的 helm 提供自定义管道或其他方式来展平配置?

标签: gokuberneteskubernetes-helmgo-templates

解决方案


我不知道有什么类似的内置功能。Sprig为 helm 模板提供了大部分有用的功能,但dict 功能只涵盖了原语。

您可以define使用一个命名模板来执行该业务并递归配置 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 -}}

在这里传递config数据有点复杂,通过 alist然后将其分离回$mapand $label。这是因为模板只接受一个变量范围

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"

推荐阅读