如何解码 Kubernetes Secret
- 运行
kubectl get secret app-db -n shop -o yaml,把输出粘贴到框中。-o json的 JSON 输出同样可以。 - 表格列出每个键及其解码值和大小,并提供 复制 和 复制 Base64 按钮。
- 输出窗格中是改写为
stringData的同一个 Secret,值为纯文本。二进制值保留在data中。 - 切换到 生成 Secret 可以反向操作:输入
KEY=value行,输出带 Base64data的 Secret。
输入还可以是 kubectl get secrets -o yaml 输出的 List、用 --- 分隔的多个文档、Helm 渲染的清单、单独的 .dockerconfigjson,或者只是一个 Base64 值。
示例:kubectl 给出的内容及其含义
apiVersion: v1
data:
DATABASE_URL: cG9zdGdyZXM6Ly9hcHA6czNjcjN0LVBhNTVAZGI6NTQzMi9zaG9w
DB_PASSWORD: czNjcjN0LVBhNTUK
DB_USER: YXBw
kind: Secret
metadata:
name: app-db
namespace: shop
type: Opaque
| 键 | 解码结果 | 大小 |
|---|---|---|
DATABASE_URL | postgres://app:s3cr3t-Pa55@db:5432/shop | 39 B |
DB_PASSWORD | s3cr3t-Pa55 加一个换行符 | 12 B |
DB_USER | app | 3 B |
密码是 11 个字符,值却有 12 个字节。有人用 echo 's3cr3t-Pa55' | base64 创建了它,末尾的换行符会导致数据库登录失败。不带换行符的 Base64 应该是 czNjcjN0LVBhNTU=。
解码器能识别什么
- PEM 证书和密钥,例如
kubernetes.io/tlsSecret 中的tls.crt和tls.key,会被标记出来。证书会附带一个指向 证书解码器 的链接,用于检查过期时间和 SAN。 - JSON 值 会被格式化。
- 二进制值(例如 Java keystore)会显示文件类型、hex 预览和一个 下载 按钮。
.dockerconfigjson和.dockercfg值会被拆分为镜像仓库、用户名和密码,auth也会被解码。.dockerconfigjson 解码器 会优先显示这些信息。
kubectl 单行命令
单个值。在 jsonpath 中,键名里的点号需要转义:
kubectl get secret app-db -o jsonpath='{.data.DB_PASSWORD}' | base64 --decode
kubectl get secret app-tls -o jsonpath='{.data.tls\.crt}' | base64 --decode
所有值,使用 kubectl 内置的 base64decode 模板函数或 jq:
kubectl get secret app-db -o go-template='{{range $k, $v := .data}}{{$k}}={{$v | base64decode}}{{"\n"}}{{end}}'
kubectl get secret app-db -o json | jq '.data | map_values(@base64d)'
创建 Secret 时避开换行符陷阱:
kubectl create secret generic app-db --from-literal=DB_PASSWORD='s3cr3t-Pa55' --dry-run=client -o yaml
更多 shell 用法见 Bash Base64 页面。
局限与常见问题
- “此输入中未找到含 data 或 stringData 的 Secret”:粘贴的内容可能是 Deployment 或 ConfigMap。ConfigMap 的值是纯文本,不需要解码。
- 大小:一个 Secret 总共不能超过 1 MiB。生成 Secret 会在你 apply 之前检查大小限制、键名以及 DNS 风格的名称。
- YAML 特性:读取器支持 kubectl、Helm 和 Kustomize 生成的内容,包括块标量和多文档。不支持锚点、别名和合并键。
- Helm release Secret(
sh.helm.release.v1.*)在 Base64 的data值里面又包含 gzip 数据的 Base64。先在这里解码外层,再使用 gzip Base64 解码器。
常见问题
怎样用 kubectl 解码 Kubernetes Secret?
单个键:kubectl get secret app-db -o jsonpath='{.data.DB_PASSWORD}' | base64 --decode。要一次解码所有键,把 -o yaml 的输出粘贴到这里,或使用本页的 go-template 或 jq 单行命令。
Kubernetes Secret 是加密的吗?
data 字段只是 Base64,任何有读权限的人都能还原。etcd 的静态加密是单独的集群设置,谁能读取 Secret 则由 RBAC 决定。参见 编码与加密的区别。
为什么解码后的 Secret 末尾有个换行符?
这个值是用 echo 而不是 echo -n 创建的,所以换行符也被编码了进去。这时它的 Base64 常常以 K、o= 或 Cg== 结尾。请用 printf '%s' value | base64 或 kubectl create secret --from-literal 重新创建。
data 和 stringData 有什么区别?
data 存放 Base64 值,stringData 接受纯文本,由 API 服务器在写入时替你编码。读取时返回的总是 data。这里的输出窗格会把 Secret 改写为 stringData 形式,方便你编辑后重新 apply。