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字段引用,用于认证私有镜像仓库。
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!"
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 编码的私钥
4.6 Secrets 类型对比与选择
下表从数据格式、安全约束和镜像拉取场景适配性三个维度对比四种核心 Secrets 类型:
| 对比维度 | Opaque | dockerconfigjson | TLS | ssh-auth |
|---|---|---|---|---|
| 数据格式 | 自由键值对 | 标准 Docker config.json | PEM 证书 + 私钥 | SSH 私钥文件 |
| 自动验证 | 无 | 创建时校验 JSON 格式 | 创建时校验证书链 | 无 |
| 镜像拉取场景 | 间接使用(需手动解析) | 直接支持 imagePullSecrets | 配置 kubelet 信任仓库 | 不适用 |
| 推荐程度 | 通用场景 | 镜像拉取首选 | HTTPS 仓库必备 | Git 操作场景 |
4.7 Secrets 类型关系架构图
下图展示了四种核心 Secrets 类型在 Kubernetes 集群中的定位及其与镜像拉取加速链路的关系:
4.8 镜像拉取加速中的 Secrets 选择策略
在构建镜像拉取加速方案时,应根据仓库类型和安全需求选择合适的 Secrets 类型组合:
- 公有仓库(无需认证):不需要 Secrets,直接使用镜像地址即可。
- 私有仓库(HTTPS + 用户名密码):使用
dockerconfigjson类型,通过imagePullSecrets引用。 - 私有仓库(HTTPS + 自签名证书):组合使用
dockerconfigjson(认证)和TLS(信任证书)。 - 私有仓库(HTTP + 用户名密码):仅使用
dockerconfigjson,但需配置 kubelet 允许不安全仓库(不推荐生产环境)。