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 加密兜底。

笔记加载中…