如何将整个 JSON 字符串传递给 Helm 图表值?

How to pass entire JSON string to Helm chart value?

如何将整个 JSON 字符串传递给 Helm 图表值?

我有 values.yml,其中配置值应包含整个 JSON 以及应用程序的配置

...
config: some JSON here
...

我需要将这个值传递给一个秘密模板,然后将它作为一个卷挂载到 Kubernetes pod。

{{- $env := default "integration" .Values.env}}
apiVersion: v1
kind: Secret
metadata:
  name: {{ .Release.Name }}-{{ $env }}
type: Opaque
data:
  config.json: {{ .Values.config | b64enc | quote }}

然而,像 '{"redis": "localhost:6379"}' 这样传递单引号字符串的明显方法失败了,因为 Helm 出于某种原因删除了字符串中的所有双引号(即使我转义了它们)所以我最终得到 {redis: localhost:6379}这不是有效的 JSON.

是否有任何其他可能性如何一次性将配置传递给 pod,而无需使用 tpl 函数加载模板文件并使所有需要的字段分别通过 values.yml 访问?

如果 .Values.config 包含 json 那么你可以在你的模板秘密中使用它

{{ .Values.config | toJson | b64enc | quote }}

使用 toJson 将 JSON 转换为 JSON 似乎很奇怪,但 helm 本身不会将其视为 JSON 直到您告诉它。有关执行此操作的示例,请参见 SO 问题

如果您想避免编码,这里有另一个建议:

env:
  - name: MYCONFIG
  value: {{ .Files.Get "config.json" | toPrettyJson }}

根据helm docs, helm uses template functions such as toPrettyJson which are supplied by the built-in Go text/template package and the Sprig template function library

当将某些东西传递给 --set 或 --set-string 并且您不希望 helm 解释它时,您想要转义每一个 =

{
[
,
.
]
}

带反斜杠。请记住您的 shell 可能会解释 \ 因此有时您可能想要 \ 或使用单个配额中的值。 在 bash:

中这样的东西对我有用
--set airflow.config.AIRFLOW__SECRETS__BACKEND_KWARGS='\{\\"variables_prefix\\": \\"/here-is-my-prefix/'${bamboo_deploy_environment}'/airflow/variables\\"\, \\"connections_prefix\\": \\"/here-is-my-prefix/'${bamboo_deploy_environment}'/airflow/connections\\"\}'

别忘了转义这个 JSON:

在 Notepad++ 中将 {{(\w+)}} 的正则表达式替换为 {{{{}}{{}}}} 有点帮助。