kubectl:从明文中的秘密中获取特定值

dav*_*wil 17 posix kubernetes kubectl

我想在 shell 脚本中获取机密的特定字段的值。

kubectl get secret文档来看,获取秘密的标准方法似乎以指定的格式返回整个事物,并使用 base64 编码的值。

所以,为了获得秘密的bar字段foo,输出为未编码的字符串,我这样做:

kubectl get secret foo -o json | jq -r ".data.bar" | base64 --decode
Run Code Online (Sandbox Code Playgroud)

那是

  • foo以 JSON 形式获取整个秘密
  • 从 JSON 中jq读取bar字段的管道
  • 使用解码值 base64

有没有办法只使用kubectl

或者 POSIX 兼容 shell 中的一种优雅方式,它不依赖于任何依赖项,例如jq?

mch*_*wre 20

尝试这个

kubectl get secret foo --template={{.data.bar}} | base64 --decode
Run Code Online (Sandbox Code Playgroud)

不需要jq。


And*_*nov 15

如果键包含点:

apiVersion: v1
metadata:
  name: foo
data:
  bar.baz: RnVja2VkIFVwIEJleW9uZCBBbGwgUmVjb2duaXRpb24=

Run Code Online (Sandbox Code Playgroud)

语法是:

kubectl get secret foo -o jsonpath="{.data['bar\.baz']}" | base64 -d

Run Code Online (Sandbox Code Playgroud)


小智 11

kubectl get secret foo -o jsonpath={.data.bar} | base64 --decode
Run Code Online (Sandbox Code Playgroud)

https://kubernetes.io/docs/reference/kubectl/jsonpath/

  • 即使路径包含连字符,这种方法也适用于我。使用 `--template` 不会(至少,不是没有某种程度的转义,这,嗯,转义了_me_) (2认同)

小智 9

您可以尝试以下命令,它将解码密钥中的所有值。

kubectl get secret <secret-name> -o json | jq '.data | map_values(@base64d)'
Run Code Online (Sandbox Code Playgroud)


SEB*_*GEM 8

从 Kubernetes 1.11 开始,这应该有效(请参阅PR 60755):

kubectl get secret foo -o go-template='{{ .data.bar | base64decode }}'


Ste*_*ire 5

对于连字符键,以下是直接从 获取解码值的转义技巧kubectl

kubectl get secret foo -o go-template='{{ index .data \"bar-baz\" | base64decode }}'
Run Code Online (Sandbox Code Playgroud)

(使用 kubectl 1.21.5 测试)