使用 yq 对 k8s 秘密值进行 Base64 编码

使用 yq 对 k8s 秘密值进行 Base64 编码

我有一个简单的 Secret.yaml 文件:

env:
  USERNAME: user
  PASSWORD: pass

我正在尝试使用 yq / jq 来编码用于创建 k8s 秘密的值,所以我的最终结果应该是:

apiVersion: v1
kind: Secret
metadata:
  name: my-service
type: Opaque
data:
   USERNAME: <base64 encoded>
   PASSWORD: <base64 encoded>

我试图使用:

yq r secret.yaml ".env" -j | jq -r ' to_entries[] | "\(.value)" | @base64'"

这给了我 Base64 编码值,但我无法将编码值插入到最终输出中。

我试图避免使用循环,但如果我找不到干净的解决方案,我会使用它。

请协助。

答案1

jq您想要应用于数据的表达式是

.env |= map_values(@base64) | { data: .env }

这会更新顶级env结构的所有值,以便它们进行 Base64 编码。然后它将env密钥“重命名”为data.

yq对于您在问题中似乎使用的特定实用程序,这是通过将 YAML 转换为 JSON、jq应用于生成的 JSON,然后将其转换回 YAML 来完成的:

$ yq -j r file.yml | jq '.env |= map_values(@base64) | { data: .env }' | yq -P r -
data:
  PASSWORD: cGFzcw==
  USERNAME: dXNlcg==

实用yq程序来自https://kislyuk.github.io/yq/(即,不是问题中使用的那个),这是使用更简洁的方式完成的

$ yq -y '.env |= map_values(@base64) | { data: .env }' file.yml
data:
  USERNAME: dXNlcg==
  PASSWORD: cGFzcw==

运行上述处理后即可添加额外的静态数据。

答案2

.data['key']请注意,您可以将解码后的值传递给 ,而不是在 Secrets 中设置 base64 编码值.stringData['key']

如果我创建一个 Secret:

stringData:
  USERNAME: user
  PASSWORD: pass

生成的对象(您将使用的kubectl get secret -o yaml)实际上包括:

data:
  USERNAME: dXNlcg==
  PASSWORD: cGFzcw==

相关内容