Kubernetes / Kubectl打印所有秘密

s g*_*s g 3 base64 jsonpath jq kubernetes kubectl

我想使用“ kubectl秘密”中的所有键/值对进行打印。我无法弄清楚如何与-o --jsonpath标志一起一行或通过管道连接到jq。我当然可以编写一个脚本来执行此操作,但是我认为必须有一种更好的方法,因为kubernetes GUI在让您查看Secrets方面非常简单直接。

假设我这样创建秘密:

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=="
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)

我可以做类似的事情

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

要么

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

要以非列表格式获取键值对,则必须base64 --decode输入值。

清除所有键值对的最简单方法是什么?在所有机密上执行此操作的加分点(而不是像我在这里所做的那样仅针对一个特定的)。

sar*_*ole 19

我把这个问题理解为询问如何一次性解码所有秘密。我在公认的答案的基础上制作了一句台词来做到这一点:

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

这样做的另一个好处是列出秘密的名称以及解码后的值以提高可读性。

  • 仅修改一个秘密:`kubectl get Secret [SECRET NAME] --namespace [NAMESPACE] -o json | jq '{名称:.metadata.name,数据:.data|map_values(@base64d)}'` (3认同)

pea*_*eak 5

足够新近的jq版本具有用于解码base64的过滤器,但是仅当编码的值是有效的JSON字符串时才可以使用它。

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

.data | map_values(@base64d)
Run Code Online (Sandbox Code Playgroud)

  • 感谢@peak 和@DomQ 对于不熟悉 jq 的人,这是一个对我有用的完整示例:`kubectl get secret testsecret -o json | jq '.data' | jq 'map_values(@base64d)'` (6认同)
  • @peak:我认为@gongo 的观点是,不熟悉 jq 的人可能在没有完整命令的情况下调用它时遇到困难。为了避免调用 jq 两次,你可以执行 `kubectl get Secret testsecret -o json | jq -r '.data | 地图值(@base64d)'` (3认同)
  • 在 Mac OS 上,`@base64d` [当前需要](https://github.com/stedolan/jq/issues/47) `brew install --HEAD jq` (2认同)
  • @gongo:不需要两次调用jq。 (2认同)

小智 5

当使用接受的答案时,您可能会遇到异常

jq: error (at <stdin>:96): Cannot iterate over null (null)

Run Code Online (Sandbox Code Playgroud)

这可能是因为某些 json 可能未完全形成,请使用额外的过滤器

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

Run Code Online (Sandbox Code Playgroud)

以上将确保产生预期结果