4. Secrets 的概念与类型:Kubernetes Secrets 概述、Opaque、dockerconfigjson、tls 等类型

在 Kubernetes 生态中,Secrets 是专门用于存储和管理敏感信息的原生资源对象,如密码、OAuth 令牌、SSH 密钥、TLS 证书以及私有镜像仓库的认证凭据。与 ConfigMap 不同,Secrets 在设计上更注重安全性,默认采用 Base64 编码存储,并支持更细粒度的访问控制和加密机制。

在《容器镜像拉取加速的 Secrets 加密传输方案》课程中,理解 Secrets 的类型与适用场景是构建安全加速链路的基础。不同类型的 Secrets 决定了数据如何被挂载、传递以及如何与 kubelet、容器运行时交互。

4.1 Kubernetes Secrets 概述

Secrets 的核心设计目标是将敏感配置与 Pod 定义解耦,避免在 YAML 清单或容器镜像中硬编码凭据。Secrets 可以通过以下方式被 Pod 使用:

  • 环境变量注入:将 Secret 中的键值对作为容器的环境变量。
  • Volume 挂载:将 Secret 作为文件挂载到容器的指定路径,每个键对应一个文件。
  • kubelet 拉取镜像:通过 imagePullSecrets 字段引用,用于认证私有镜像仓库。
安全提示: Base64 编码并非加密。任何拥有集群 API 访问权限的用户都可以解码 Secret 数据。生产环境应启用 Encryption at Rest(静态加密)并配合 RBAC 严格控制访问。

4.2 Secrets 的核心类型

Kubernetes 原生支持多种 Secrets 类型,每种类型对应不同的数据格式和使用场景。下表列出了最常用的四种类型:

类型 用途 数据键约定 典型场景
Opaque 通用型,存储任意键值对 用户自定义 数据库密码、、应用配置令牌
kubernetes.io/dockerconfigjson 存储 Docker 私有仓库认证凭据 .dockerconfigjson 镜像拉取加速场景中的私有 Registry 认证
kubernetes.io/tls 存储 TLS 证书和私钥 tls.crt、tls.key Ingress 证书、mTLS 通信、镜像仓库 HTTPS 证书
kubernetes.io/ssh-auth 存储 SSH 认证凭据 ssh-privatekey Git 仓库访问、远程主机认证

4.3 Opaque 类型详解

Opaque 是最通用的 Secrets 类型,也是默认类型。它不强制数据格式,允许用户存储任意键值对。在镜像拉取加速场景中,Opaque 常用于存储镜像仓库的访问令牌或临时凭证。

创建 Opaque Secret 的示例:

kubectl create secret generic registry- \
  --from-literal=username=admin \
  --from-literal=password='S3cur3P@ss!'

对应的 YAML 定义:

apiVersion: v1
kind: Secret
metadata:
  name: registry-
type: Opaque
data:
  username: YWRtaW4=          # base64 编码后的 "admin"
  password: UzNjdXIzUEBzcyE=  # base64 编码后的 "S3cur3P@ss!"
注意: 在 YAML 中使用 data 字段时必须预先对值进行 Base64 编码。若希望 Kubernetes 自动编码,可使用 stringData 字段(明文写入,创建时自动转为 Base64)。

4.4 dockerconfigjson 类型详解

kubernetes.io/dockerconfigjson 是镜像拉取加速方案中最关键的 Secrets 类型。它专门用于存储 Docker 客户端认证凭据,格式与 ~/.docker/config.json 完全兼容。

创建 dockerconfigjson Secret 的推荐方式:

kubectl create secret docker-registry my-registry-key \
  --docker-server=https://myregistry.example.com \
  --docker-username=myuser \
  --docker-password=mypassword \
  --docker-email=user@example.com

生成的 Secret 内部数据结构如下:

{
  "auths": {
    "https://myregistry.example.com": {
      "username": "myuser",
      "password": "mypassword",
      "email": "user@example.com",
      "auth": "bXl1c2VyOm15cGFzc3dvcmQ="
    }
  }
}

在 Pod 中引用该 Secret 进行镜像拉取:

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app
    image: myregistry.example.com/myapp:latest
  imagePullSecrets:
  - name: my-registry-key

4.5 TLS 类型详解

kubernetes.io/tls 类型用于存储 TLS 证书及其对应的私钥。在镜像拉取加速场景中,当私有镜像仓库启用了 HTTPS 且使用自签名证书时,TLS Secret 可用于配置 kubelet 信任该证书。

创建 TLS Secret 的示例:

kubectl create secret tls registry-tls \
  --cert=path/to/tls.crt \
  --key=path/to/tls.key

对应的 YAML 定义:

apiVersion: v1
kind: Secret
metadata:
  name: registry-tls
type: kubernetes.io/tls
data:
  tls.crt: LS0tLS1CRUdJTiBDRV...   # Base64 编码的证书
  tls.key: LS0tLS1CRUdJTiBSU0...   # Base64 编码的私钥
最佳实践: 在镜像拉取加速架构中,建议将 dockerconfigjson 与 TLS Secret 组合使用:dockerconfigjson 负责认证,TLS Secret 负责加密通道的信任建立,两者共同保障传输安全。

4.6 Secrets 类型对比与选择

下表从数据格式、安全约束和镜像拉取场景适配性三个维度对比四种核心 Secrets 类型:

对比维度 Opaque dockerconfigjson TLS ssh-auth
数据格式 自由键值对 标准 Docker config.json PEM 证书 + 私钥 SSH 私钥文件
自动验证 无 创建时校验 JSON 格式 创建时校验证书链 无
镜像拉取场景 间接使用(需手动解析) 直接支持 imagePullSecrets 配置 kubelet 信任仓库 不适用
推荐程度 通用场景 镜像拉取首选 HTTPS 仓库必备 Git 操作场景

4.7 Secrets 类型关系架构图

下图展示了四种核心 Secrets 类型在 Kubernetes 集群中的定位及其与镜像拉取加速链路的关系:

Kubernetes Secrets 类型与镜像拉取加速关系图 Kubernetes Secrets 类型与镜像拉取加速关系 Kubernetes Secrets Opaque dockerconfigjson TLS ssh-auth 应用场景 数据库密码、API 令牌 通用键值对存储 应用场景 私有镜像仓库认证 imagePullSecrets 直接引用 应用场景 HTTPS 证书、mTLS kubelet 信任仓库证书 应用场景 Git 仓库访问 远程主机认证 镜像拉取加速链路:dockerconfigjson + TLS 组合使用

4.8 镜像拉取加速中的 Secrets 选择策略

在构建镜像拉取加速方案时,应根据仓库类型和安全需求选择合适的 Secrets 类型组合:

  1. 公有仓库(无需认证):不需要 Secrets,直接使用镜像地址即可。
  2. 私有仓库(HTTPS + 用户名密码):使用 dockerconfigjson 类型,通过 imagePullSecrets 引用。
  3. 私有仓库(HTTPS + 自签名证书):组合使用 dockerconfigjson(认证)和 TLS(信任证书)。
  4. 私有仓库(HTTP + 用户名密码):仅使用 dockerconfigjson,但需配置 kubelet 允许不安全仓库(不推荐生产环境)。