Passing a string containing curly brackets to helm caused: Error: failed parsing --set data: key

Passing a string containing curly brackets to helm caused: Error: failed parsing --set data: key

${CLIENT_ID}${CLIENT_SECRET} 都来自基于 yaml 的属性文件,例如

CLIENT_ID: 11111111-1111-1111-1111-111111111111
CLIENT_SECRET: '{aes}AM+JYP8t9ga1m6s111x1fjdfePL10v90RmbgWFdOjVdD/wlnszAbJad8aOI4qqMv6eSGaW2nfTF4PG2OYH+rx9K052TXNP6PGAAcRph9pl11'

使用:

PROPERTIES_FILE="properties.yaml"
CLIENT_ID=$(yq r "${PROPERTIES_FILE}" CLIENT_ID)
CLIENT_SECRET=$(yq r "${PROPERTIES_FILE}" CLIENT_SECRET)

然后传递到我的 helm 命令以部署我的应用程序:


echo ${CLIENT_ID}
# 11111111-1111-1111-1111-111111111111
echo ${CLIENT_SECRET}
# {aes}AM+JYP8t9ga1m6s111x1fjdfePL10v90RmbgWFdOjVdD/wlnszAbJad8aOI4qqMv6eSGaW2nfTF4PG2OYH+rx9K052TXNP6PGAAcRph9pl11

helm upgrade -i --debug  --namespace mynamespace release \
-f "charts/app/values.yaml" \
--set "app.configmap.dependancy.client_id=${CLIENT_ID}" \
--set "app.configmap.dependancy.client_secret=${CLIENT_SECRET}" \
"charts/app/"

charts/app/values.yaml 包含:

app:
  ..
  configmap:
    dependancy:
      client_id: ""
      client_secret: ""

问题是,当 运行 helm 命令时出现此错误:

Error: failed parsing --set-string data: key "AM+JYP8t9ga1m6s111x1fjdfePL10v90RmbgWFdOjVdD/wlnszAbJad8aOI4qqMv6eSGaW2nfTF4PG2OYH+rx9K052TXNP6PGAAcRph9pl11" has no value
No resources found.

知道为什么前缀 {aes} 在像这样传递给 helm 时会引起问题吗?如果我删除 {aes} 前缀,该命令将起作用。

Helm 试图使 pass some structured data in using --set 成为可能,这让你在这里绊倒了。特别是,

Lists can be expressed by enclosing values in { and }. For example, --set name={a, b, c} translates to [a list of a, b, and c].

因此,如果您 --set 'key={aes}AM+JYP8...'{aes} 部分看起来像列表语法,但 Helm 无法理解其后的内容。

您可以对大括号进行反斜杠转义,尽管这在 shell 语法中有点棘手。有一个 --set-string 选项(记录在 Helm 2 documentation 中,但仍然存在于 Helm 3 中)可能能够做到这一点。不过,最直接的方法可能是编写您自己的自定义 YAML 值文件:

#!/bin/sh
PROPERTIES_FILE="properties.yaml"
CLIENT_ID=$(yq r "${PROPERTIES_FILE}" CLIENT_ID)
CLIENT_SECRET=$(yq r "${PROPERTIES_FILE}" CLIENT_SECRET)

cat >values.tmp.yaml <<EOF
app:
  configmap:
    dependancy:
      client_id: "${CLIENT_ID}"
      client_secret: "${CLIENT_SECRET}"
EOF

helm upgrade -i --debug --namespace mynamespace release \
  -f values.tmp.yaml charts/app

(如果需要,您可以有多个 helm install -f 选项。图表的 values.yaml 会自动读入,并被命令行选项覆盖。)