解码 Kubernetes 秘密

Cec*_*uez 71 docker kubernetes

我继承了 Kubernetes/Docker 设置,但由于更改了与数据库密码相关的内容,我不小心使 pod 崩溃。

我正在尝试解决此问题。

我没有太多的 Kubernetes 或 Docker 经验,所以我仍在学习如何做事。

该值包含在我相信的 db-user-pass 凭证中,这是一个 Opaque 类型的秘密。

我是这样描述的:

kubectl describe secrets/db-user-pass
Name:         db-user-pass
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  16 bytes
username:  13 bytes
Run Code Online (Sandbox Code Playgroud)

但我不知道如何从这个秘密中获取任何数据。Kubernetes 站点上的示例似乎假设我将拥有一个 base64 编码的字符串,但我什至无法理解。我如何获得这个价值?

Ami*_*pta 98

您可以使用kubectl get secrets/db-user-pass -o yaml-o json在您将看到 base64 编码usernamepassword. 然后您可以复制该值并使用echo <ENCODED_VALUE> | base64 -D(Mac OS X)之类的东西对其进行解码。

一个更紧凑的单线:

kubectl get secrets/db-user-pass --template={{.data.password}} | base64 -D
Run Code Online (Sandbox Code Playgroud)

同样对于用户名:

kubectl get secrets/db-user-pass --template={{.data.username}} | base64 -D
Run Code Online (Sandbox Code Playgroud)

注意:在 GNU/Linux 上,base64 标志是-d,而不是-D

  • 根据centos7上的base64,命令是`base64 -d`而不是-D (15认同)
  • 当秘密中的密钥包含点(例如“credentials.json”)时,此模板不起作用。工作变体是:`kubectl get Secrets/secret-name --template="{{index .data \"credentials.json\" | base64decode}}"`。另请注意,使用 Go 的“base64decode”而不是操作系统的“base64”,使其可以在任何操作系统下工作。 (6认同)
  • 这个答案是由某人在 mac 操作系统上发布的。`-d` 是 Linux 中解码的适当参数。 (4认同)
  • -D 也不适用于 ubuntu 18 (2认同)

Bře*_*jek 51

我建议使用这个方便的命令。它利用了go-templates的强大功能。它遍历所有值,对它们进行解码,然后将它们与密钥一起打印出来。它还处理未设置的值。

kubectl get secret name-of-secret -o go-template='
{{range $k,$v := .data}}{{printf "%s: " $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{"\n"}}{{end}}'

## In your case it would output
# password: decoded_password
# username: doceded_username
Run Code Online (Sandbox Code Playgroud)

如果您不喜欢 go-templates,您可以使用不同的输出格式,例如yamljson,但这将输出由 base64 编码的秘密。

  • 这是最有力的答案。 (2认同)

Cha*_*yer 31

如果您有 jq(json 查询),则此方法有效:

kubectl get secret db-user-pass -o json | jq '.data | map_values(@base64d)'
Run Code Online (Sandbox Code Playgroud)

笔记:

  • db-user-pass 是k8s秘密的名字
  • .data 是包含秘密值的变量

  • 这给出了最好的结果! (4认同)
  • 这有效!请注意,它需要 jq 1.6 或更高版本(某些系统上未安装基线),并且可能存在问题 https://github.com/stedolan/jq/issues/47 (3认同)

Mao*_*dok 28

这应该适用于所有平台,包括 kubectl 1.11+

kubectl get secrets/db-user-pass --template='{{.data.password | base64decode}}'
Run Code Online (Sandbox Code Playgroud)

如果密码中有“-”,则以下内容有效

kubectl get secrets/db-user-pass --template='{{ index .data "sql-password" | base64decode}}'
Run Code Online (Sandbox Code Playgroud)

如果你想获取所有键、值

kubectl get secrets/db-user-pass --template='{{ range $key, $value := .data }}{{ printf "%s: %s\n" $key ($value | base64decode) }}{{ end }}'
Run Code Online (Sandbox Code Playgroud)


Tor*_*Tor 16

这个jsonpath变体在 OSX 上适用于我。

kubectl get secrets/db-user-pass -o jsonpath="{.data.username}" | base64 -d
Run Code Online (Sandbox Code Playgroud)

名称中带有点以获取秘密。

kubectl get secrets/tls -o jsonpath="{.data['tls\.crt']}" | base64 -d
Run Code Online (Sandbox Code Playgroud)


cak*_*aww 9

如果您的密钥包含破折号 ( -) 或点 ( .):

kubectl get secret db-user-pass -o=go-template='{{index .data "password"}}' | base64 -d
Run Code Online (Sandbox Code Playgroud)


Mal*_*thi 6

这是您可能正在寻找的链接

Kubernetes 机密需要以 base64 编码格式提供机密,在 linux 发行版的情况下,可以使用 base64 二进制文件创建。

例子:

echo "hello" | base64
aGVsbG8K
Run Code Online (Sandbox Code Playgroud)

当我们将密钥作为环境变量传递或作为卷安装时,Kubernetes 会解码 base64 编码。

  • 附加“--decode”参数以从 Base64 解码秘密。 (2认同)
  • `回声“aGVsbG8K”| base64 --decode` 将输出 `hello` (2认同)

Vai*_*ain 6

首先,通过使用 kubectl 查询 api 服务器从 etcd 中获取机密。

kubectl get secret db-user-pass -o yaml 
Run Code Online (Sandbox Code Playgroud)

这将为您提供 yaml 格式的 base64 编码秘密。

一旦你有了 yaml 文件,就使用

“base64 --decode”

最终命令将如下所示:不要忘记-necho 命令中的标志

echo -n "jdddjdkkdkdmdl" | base64 --decode