3. Kubernetes Secrets 基础:Secret 资源定义、类型与创建方式
在容器镜像拉取加速场景中,Kubernetes Secrets 是承载私有仓库认证凭据的核心载体。理解 Secret 的资源定义、类型及创建方式,是后续实现外部集成配置的前提。本章将系统梳理 Secret 的基础知识,重点聚焦 Opaque 与 dockerconfigjson 两种类型。
3.1 Secret 资源定义与核心字段
Secret 是 Kubernetes 内置的命名空间级资源,用于存储敏感数据(如密码、、证书)。其数据以 Base64 编码存储于 data 字段中,或明文存储于 stringData 字段(仅用于创建/更新)。
| 字段 | 类型 | 说明 |
|---|---|---|
apiVersion |
string | 固定为 v1 |
kind |
string | 固定为 Secret |
metadata |
ObjectMeta | 包含 name、namespace、labels 等 |
type |
SecretType | 标识 Secret 用途,如 Opaque、kubernetes.io/dockerconfigjson |
data |
map[string][]byte | Base64 编码的键值对 |
stringData |
map[string]string | 明文键值对,写入时自动编码为 Base64 |
提示:
stringData 仅在创建或更新时使用,读取 Secret 时始终返回 data 中的 Base64 编码值。
3.2 Secret 类型对比:Opaque vs dockerconfigjson
Kubernetes 定义了多种 Secret 类型,其中 Opaque 和 kubernetes.io/dockerconfigjson 是容器镜像拉取场景中最常用的两种。
| 类型 | 用途 | 数据格式 | 典型场景 |
|---|---|---|---|
| Opaque | 通用敏感数据存储 | 任意键值对,Base64 编码 | 存储 、密码、证书文件 |
| kubernetes.io/dockerconfigjson | Docker 私有仓库认证 | 包含 .dockerconfigjson 键,值为 Docker 配置 JSON 的 Base64 编码 |
Pod 拉取私有镜像时引用 |
关键区别: Opaque 不限定数据结构,适合通用场景;dockerconfigjson 专为 Docker 客户端认证设计,Kubernetes 会自动解析其内容用于
imagePullSecrets。
3.3 创建 Secret 的三种方式
Kubernetes 提供声明式 YAML、命令行指令和自动生成三种创建方式,满足不同运维习惯与自动化需求。
3.3.1 方式一:声明式 YAML 创建
通过 YAML 文件定义 Secret 资源,适用于版本管理与 CI/CD 集成。
# opaque-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: my-opaque-secret
namespace: default
type: Opaque
data:
username: YWRtaW4= # admin
password: MWYyZDFlMmU2N2Rm # 1f2d1e2e67df
---
# dockerconfig-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: my-registry-secret
namespace: default
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: eyJhdXRocyI6eyJodHRwczovL2luZGV4LmRvY2tlci5pby92MS8iOnsiYXV0aCI6IlpXNTZZWEJwYzNSeVlXbG5hVzVrT2lCb2RIUndjem92TDNkM2R5NXBibVp2WDJsa0xtTnZiUzloY0hCekxtTnZiUT09In19fQ==
注意: 手动计算 Base64 容易出错,推荐使用
echo -n "value" | base64 生成编码值。对于 dockerconfigjson,更建议使用命令行方式自动生成。
3.3.2 方式二:命令行指令创建
使用 kubectl create secret 命令,无需手动编码,适合快速创建与调试。
# 创建 Opaque Secret(从字面值)
kubectl create secret generic my-opaque-secret \
--from-literal=username=admin \
--from-literal=password=1f2d1e2e67df
# 创建 Opaque Secret(从文件)
kubectl create secret generic my-opaque-secret \
--from-file=./cert.pem
# 创建 dockerconfigjson Secret
kubectl create secret docker-registry my-registry-secret \
--docker-server=https://index.docker.io/v1/ \
--docker-username=myuser \
--docker-password=mypassword \
--docker-email=myuser@example.com
3.3.3 方式三:自动生成(kubectl 与 Helm 集成)
在 Helm Chart 或自动化脚本中,可利用模板函数或 kubectl 组合命令动态生成 Secret,避免硬编码。
# Helm 模板示例(_helpers.tpl)
{{- define "imagePullSecret" }}
{{- printf "{\"auths\":{\"%s\":{\"auth\":\"%s\"}}}" .Values.registry.url (printf "%s:%s" .Values.registry.username .Values.registry.password | b64enc) | b64enc }}
{{- end }}
# 使用方式(deployment.yaml)
apiVersion: v1
kind: Secret
metadata:
name: {{ include "myapp.fullname" . }}-registry
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: {{ include "imagePullSecret" . }}
3.4 Secret 类型与创建方式对照表
| 创建方式 | Opaque | dockerconfigjson | 适用场景 |
|---|---|---|---|
| YAML 声明式 | 支持 | 支持(需手动编码) | 版本管理、GitOps |
kubectl create secret generic |
支持 | 不支持 | 通用敏感数据快速创建 |
kubectl create secret docker-registry |
不支持 | 支持 | Docker 仓库认证专用 |
| Helm 模板自动生成 | 支持 | 支持 | Chart 部署、多环境管理 |
3.5 Secret 数据流与 Pod 引用关系
下图展示了 Secret 从创建到被 Pod 引用的完整数据流,重点突出 dockerconfigjson 类型在镜像拉取过程中的作用。
3.6 最佳实践与避坑指南
- 优先使用 dockerconfigjson 类型: 对于私有镜像仓库认证,始终使用
kubernetes.io/dockerconfigjson而非 Opaque,Kubernetes 会原生解析并处理。 - 避免手动 Base64 编码: 使用
kubectl create secret docker-registry或 Helm 模板自动生成,减少编码错误。 - 限制 Secret 访问权限: 通过 RBAC 控制 Secret 的 get/list 权限,避免敏感数据泄露。
- 不要将 Secret 硬编码到镜像或代码仓库: 使用外部 Secret 存储(如 HashiCorp Vault、External Secrets Operator)实现动态注入。
- 注意 Secret 大小限制: etcd 默认单个 Secret 不超过 1MB,超出时考虑拆分或使用外部存储。
核心要点: Opaque 是通用型 Secret,dockerconfigjson 是镜像拉取专用型 Secret。掌握两者的创建方式与引用机制,是后续实现 Secrets 外部集成配置的基础。