我有一个简单的 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==