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

kubectl: get specific value from a secret in plaintext

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

kubectl get secret 文档来看,这似乎是获取秘密的标准方法 returns 整个事情,以指定格式,值 base64 编码。

因此,要获取 foo 秘密的 bar 字段,输出为未编码的字符串,我正在这样做:

kubectl get secret foo -o json | jq -r ".data.bar" | base64 --decode

也就是

有没有办法仅使用 kubectl 来做到这一点?

或者在 POSIX-compliant shell 中不依赖任何依赖项的优雅方式 jq?

试试这个

kubectl get secret foo --template={{.data.bar}} | base64 --decode

不需要jq。

从 Kubernetes 1.11 开始这应该可以工作(参见 PR 60755):

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

kubectl get secret foo -o jsonpath={.data.bar} | base64 --decode

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

如果键包含点:

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

语法为:

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

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

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

(使用 kubectl 1.21.5 测试)