首页/云/Kubernetes 速查/Secret 的 data 与 stringData
配置与存储54 条

Secret 的 data 与 stringData

data 需要 base64 编码、stringData 直接写明文(写入时自动转 data);读取时永远看 data(base64)。

Kubernetes 速查云更新于 2026-10-13

两种数据写法

Secret 有两个存放键值的位置:data 要求值是 base64 编码后的字符串,stringData 允许直接写明文,API Server 在落库时会自动把它转成 data。这个不对称带来两条铁律:写入时用 stringData 最省心,因为不用手工编码;读取时永远只有 data,拿到的一定是 base64 形式,需要解码才能看到原文。

两种写法对比

维度datastringData
值的形态必须是 base64 编码字符串直接写明文,可用特殊字符
写入过程原样存储,不做解码校验apiserver 自动转 base64 后存入 data
读取结果看到 base64看不到 stringData,读出来仍是 data 的 base64
键名冲突以 stringData 为准同一次提交里同名键由它覆盖
适用建议由工具生成清单时使用人工编写、需要粘贴复杂口令时使用

典型使用场景

  • 手工编写清单:把生成好的随机口令直接写进 stringData,避免每次都要 base64 编码
  • 流水线渲染清单:CI 把变量填进 stringData 生成临时 Secret,再 apply 到集群
  • 从外部系统导入凭据:脚本把导出的明文用 stringData 提交,减少一次手工编码步骤
  • 核对线上凭据:用 jsonpath 取 data.password 再 base64 -d,确认与预期一致
  • 生成镜像拉取凭据:kubectl create secret docker-registry 同样落到 data 的 .dockerconfigjson 键

两种写法示例

两种写法示例
apiVersion: v1
kind: Secret
metadata:
  name: db-pass
type: Opaque
stringData:
  password: 'S3cr3t-With-Special-Chars!'   # 明文写,落库时自动转 base64
data:
  username: YWRtaW4=                        # 等价于 echo -n admin | base64

编码与解码

编码与解码
printf 'admin' | base64                       # 生成 base64:务必用 printf 或 echo -n
printf 'YWRtaW4=' | base64 -d                  # 解码并原样输出,不加换行
kubectl get secret db-pass -o jsonpath='{.data.username}' | base64 -d; echo
kubectl get secret db-pass -o jsonpath='{.data}' | jq -r 'to_entries[] | "\(.key)=\(.value|@base64d)"'

字段读法

字段含义注意点
typeSecret 类型,Opaque 为通用类型kubernetes.io/tls、dockerconfigjson 等类型有固定键名要求
data.<key>base64 编码后的值解码后不要贴进工单或聊天记录
stringData.<key>清单里的明文写法read 对象时该字段不存在,它与 data 合并
metadata.nameSecret 名改名相当于新建,引用它的工作负载要同步改
base64 是编码而不是加密:任何能读到 Secret 对象的人都能立即还原明文。真正需要保护时依赖的是静态加密(EncryptionConfiguration,如 KMS 或 aescbc)与收紧的 RBAC,而不是编码形式。
kubectl create secret generic 带 --dry-run=client -o yaml 可以把已有明文文件转成清单再提交,比手工编码可靠;同一次提交里 data 与 stringData 出现相同键时以 stringData 为准,但不建议依赖这个行为。

易错点

  • 用 echo 不带 -n 生成 base64:换行被一起编码进值里,密码末尾多一个 \n,应用报鉴权失败且肉眼极难发现
  • 把 stringData 当成「只在写入时存在、读取也能看到」的字段:read 出来只有 data,误以为自己的明文丢了
  • 把 Secret 清单连同明文口令一起提交进 Git 仓库:集群只是薄薄一层编码,仓库里的明文长期留存
  • base64 解码后直接 echo 到终端做对比,明文落进 shell 历史与终端缓存

数据来源与参考

  • Kubernetes 官方文档 · Secret(data/stringData)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌