Skip to content

Kubernetes-Secret

Secret 是 Kubernetes 中用于存储和管理敏感信息的核心资源对象,专为密码、令牌、密钥等敏感数据设计。

Secret 基础概念

Secret 是 Kubernetes 中用于存储敏感信息的对象,与 ConfigMap 类似但专门设计用于敏感数据。其主要特点包括:

  • 数据默认以 base64 编码存储(非加密)
  • 可以通过卷或环境变量注入到 Pod 中
  • 支持细粒度的访问控制
  • 设计用于机密数据,而 ConfigMap 设计用于非机密数据

Secret 允许用户对如何使用敏感信息进行更多的控制,并减少信息意外暴露的风险。默认情况下,Secret 值被编码为 base64 字符串并以非加密的形式存储,但可以配置为静态加密(Encrypt at rest)。

Secret 的主要类型

Kubernetes 支持多种内置的 Secret 类型:

  1. Opaque:默认类型,用于存储任意用户定义的敏感数据(如密码、密钥等)
  2. kubernetes.io/service-account-token:用于自动为 Pod 提供访问 Kubernetes API 的凭据(与 ServiceAccount 相关)
  3. kubernetes.io/dockerconfigjson:用于存储 Docker 镜像仓库的认证信息(用于 docker pull 鉴权)
  4. kubernetes.io/tls:用于存储 TLS 证书和私钥(用于 HTTPS 服务)
  5. kubernetes.io/basic-auth:基本认证凭据
  6. kubernetes.io/ssh-auth:SSH 认证凭据

Secret 字段解析

apiVersion

  • 固定值为 v1,表示使用 Kubernetes 核心 API 版本
  • 示例:apiVersion: v1

kind

  • 固定值为 Secret,标识资源类型
  • 示例:kind: Secret

metadata

包含资源的元数据信息:

  • name: Secret 名称(DNS 子域名格式)

  • namespace: 所属命名空间

  • labels: 标签用于资源分类

  • annotations: 注解用于附加非标识性信息

    • 示例:
      yaml
      metadata:
        name: db-credentials
        namespace: production
        labels:
          app: mysql
        annotations:
          created-by: "admin"

type

定义 Secret 的类型,常见值包括:

  • Opaque: 默认类型,存储任意用户定义数据
  • kubernetes.io/tls: 存储 TLS 证书和私钥
  • kubernetes.io/dockerconfigjson: 存储 Docker 仓库认证信息
  • kubernetes.io/service-account-token: 服务账号令牌

data

  • 存储 base64 编码的键值对数据
  • 键名必须由字母、数字、-_. 组成
  • 示例:
    yaml
    data:
      username: YWRtaW4=  # "admin"的base64编码
      password: MWYyZDFlMmU2N2Rm  # "1f2d1e2e67df"的base64编码

stringData

  • 存储未编码的原始字符串(写入时自动进行 base64 编码)
  • 与 data 字段共存时,stringData 优先级更高
  • 适合直接写入多行文本内容(如证书文件)
  • 示例:
    yaml
    stringData:
      config.yaml: |
        apiUrl: "https://api.example.com"
        username: admin
        password: P@ssw0rd

immutable (布尔值)

  • 设置为 true 时使 Secret 不可修改(Kubernetes 1.19+)
  • 不可变 Secret 能减少 API 服务器负载
  • 修改需先删除后重建
  • 示例:immutable: true

TLS 类型 Secret

yaml
type: kubernetes.io/tls
data:
  tls.crt: <base64编码的证书>
  tls.key: <base64编码的私钥>

Docker 注册表认证 Secret

yaml
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: <base64编码的docker配置>

创建 Secret 的方法

通过 YAML 清单文件创建

首先将敏感数据转换为 base64 编码:

bash
echo -n 'admin' | base64  # 输出: YWRtaW4=
echo -n 'admin321' | base64  # 输出: YWRtaW4zMjE=

然后创建 Secret 定义文件:

yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
  password: YWRtaW4zMjE=

应用这个配置:

bash
kubectl apply -f secret.yaml

使用 kubectl 命令直接创建

更简单的方式是直接使用 kubectl 命令:

bash
kubectl create secret generic mysecret \
  --from-literal='username=admin' \
  --from-literal='password=admin321'

或者从文件创建:

bash
echo -n 'admin' > username.txt
echo -n 'admin321' > password.txt
kubectl create secret generic mysecret \
  --from-file=username=./username.txt \
  --from-file=password=./password.txt

创建 Docker 仓库认证 Secret

bash
kubectl create secret docker-registry myregistry \
  --docker-server=DOCKER_SERVER \
  --docker-username=DOCKER_USER \
  --docker-password=DOCKER_PASSWORD \
  --docker-email=DOCKER_EMAIL

在 Pod 中使用 Secret

作为环境变量注入

yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
    - name: SECRET_USERNAME			# 自定义变量名
      valueFrom:
        secretKeyRef:				# 引用secret资源
          name: mysecret			# secret名字
          key: username				# secret中定义的变量名
    - name: SECRET_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: password

作为卷挂载

yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-vol-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      items:
      - key: username
        path: my-group/my-username

用于拉取私有镜像

yaml
apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: private.registry.com/image
  imagePullSecrets:
  - name: regcred

常用命令参考

bash
# 查看 Secret
kubectl get secrets
kubectl describe secret mysecret

# 解码 Secret
kubectl get secret mysecret -o jsonpath='{.data.username}' | base64 --decode

# 更新 Secret
kubectl create secret generic db-secret \
  --from-literal=username=newuser \
  --from-literal=password=newpass \
  --dry-run=client -o yaml | kubectl apply -f -

# 删除 Secret
kubectl delete secret mysecret

通过合理使用 Kubernetes Secret,可以有效地保护敏感数据,同时保持应用配置的灵活性。在实际生产环境中,建议结合 RBAC 和网络策略等安全机制,构建全面的敏感数据保护体系。