Kubernetes / kubectl 打印所有秘密

Kubernetes / kubectl print all secrets

我想使用 kubectl 打印出我的 Secrets 中的所有键值对。我不知道如何在一行中使用 -o --jsonpath 标志或通过管道输入 jq 来执行此操作。我当然可以编写一个脚本来执行此操作,但我觉得必须有更好的方法,因为在让您查看 Secrets 时,kubernetes GUI 非常简单和自由。[​​=19=]

假设我像这样创建秘密:

kubectl create secret generic testsecret --from-literal=key1=val1 --from-literal=key2=val2

现在我可以 运行 kubectl get secret testsecret -o json 得到类似的东西:

{
    "apiVersion": "v1",
    "data": {
        "key1": "dmFsMQ==",
        "key2": "dmFsMg=="
    },
    ...
}

我可以做类似的事情

kubectl get secret testsecret -o jsonpath='{.data}'

kubectl get secret testsecret -o json | jq '.data'

非列表 格式获取我的键值对,然后我必须 base64 --decode 值。

获得所有键值对的干净列表的最简单方法是什么?在所有秘密中执行此操作的奖励积分(而不是像我在这里所做的那样只针对一个特定的秘密)。

足够新的 jq 版本有一个用于解码 base64 的过滤器,但它只能在编码的值是有效的 JSON 字符串时使用。

无论如何,您可以先尝试:

.data | map_values(@base64d)

如果您需要从 kubernetes 秘密中提取 tls 证书 and/or 密钥并且您有不支持的旧 jq 版本 map_values(@base64d):

kubectl get secrets tls-cert -o json | jq '.data' | cut -d '"' -f 4 | tr -d '{}' | base64 --decode

我读到这个问题是询问如何一次性解码所有秘密。我基于已接受的答案生成 one-liner 来执行此操作:

kubectl get secrets -o json | jq '.items[] | {name: .metadata.name,data: .data|map_values(@base64d)}'

这有一个额外的好处,即列出机密的名称以及解码值以提高可读性。