Secret 敏感信息管理
数据库密码、Token、TLS 证书不能明文写进镜像或 yaml。Secret 是保存这类敏感信息的专用对象,用法与 ConfigMap 相似,但内容以 base64 编码存储,并可声明类型,配合 RBAC 与 etcd 加密实现敏感数据的受控存取。
Secret 与 ConfigMap 的差异
- ConfigMap 存普通配置,Secret 存敏感信息,二者挂载/注入方式几乎一致。
- Secret 的值在存储与展示时是 base64 编码(编码不是加密)。
- Secret 通过 type 区分用途:Opaque(默认键值)、kubernetes.io/tls(证书)、kubernetes.io/dockerconfigjson(镜像仓库凭据)。
创建 Secret
常用三种创建命令:
kubectl create secret generic db-auth \
--from-literal=username=root --from-literal=password=p@ss123
kubectl create secret tls web-tls --cert=tls.crt --key=tls.key
kubectl create secret docker-registry regcred \
--docker-server=https://index.docker.io/v1/ \
--docker-username=myuser --docker-password=mypass
值本身必须是 base64,写 yaml 前先编码:
echo -n 'p@ss123' | base64
# 输出:cEBzczEyMw==
apiVersion: v1
kind: Secret
metadata:
name: db-auth
type: Opaque
data:
username: cm9vdA==
password: cEBzczEyMw==
挂载与 env 引用
挂成文件、注入环境变量都与 ConfigMap 相同,单个键用 secretKeyRef:
apiVersion: v1
kind: Pod
metadata:
name: secret-demo
spec:
containers:
- name: app
image: myapp:1.0
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-auth
key: password
volumeMounts:
- name: cred
mountPath: /etc/cred
volumes:
- name: cred
secret:
secretName: db-auth
镜像仓库凭据类 Secret 不必挂载,直接在 Pod 里 imagePullSecrets 引用:
spec:
imagePullSecrets:
- name: regcred
读取与解密
Secret 中看到的是 base64,需要解码才是原文:
kubectl get secret db-auth -o yaml # 看到 base64 值
echo -n 'cEBzczEyMw==' | base64 -d
# 输出:p@ss123
安全注意
- base64 只是编码:能读 etcd 或能 get Secret 的人都能还原内容,真正保护靠 RBAC 收紧权限与集群开启 etcd 加密存储。
- 避免把 Secret 塞进镜像或提交到 git;secret 内容不该出现在日志里。
小结:Secret 用 base64 保存密码/证书/仓库凭据,generic/tls/docker-registry 命令覆盖多数场景,挂载与 env 引用和 ConfigMap 一致;切记 base64 只是编码形式,安全要靠 RBAC 与 etcd 加密兜底。