Secret
Secret 是 Kubernetes 中专门用于存储敏感数据的对象,它和 ConfigMap 类似,都是以键值对形式保存配置,但 Secret 专门用于保存 密码、证书、API Token 等机密信息,并且在传输和存储时会进行编码和保护。
🧩 Secret 的核心作用
- 存储敏感数据:以键值对形式保存密码、证书、API Token 等机密信息。
- 安全访问:Pod 可以通过环境变量、挂载文件或 API 调用来安全地使用这些数据。
- 与 ConfigMap 区分:ConfigMap 用于非机密配置,Secret 专门用于机密数据。
- 轻量存储:适合保存小型敏感信息,不适合存储大文件。
📌 类比理解
Secret = 保险柜
- 普通说明书(ConfigMap)可以放在文件柜里,大家都能查阅。
- 敏感文件(密码、证书)必须放在保险柜(Secret)里,只有有权限的人才能打开。
- Pod 启动时,如果需要密码,就会从保险柜里取出。
⚙️ 创建 Secret 的常用方式
| 方法 | 命令示例 | 说明 |
|---|---|---|
| 从字面值创建 | kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password=12345 |
直接定义键值对。 |
| 从文件创建 | kubectl create secret generic tls-secret --from-file=cert.pem --from-file=key.pem |
将文件内容作为值。 |
| 从目录创建 | kubectl create secret generic tls-secret --from-file=./tls/ |
将目录下所有文件打包为键值。 |
查看详情:
kubectl describe secret db-secret
kubectl get secret db-secret -o yaml
🧠 Secret 与 Pod 的结合方式
Pod 可以通过以下四种方式使用 Secret:
- 环境变量注入:在容器启动时读取敏感数据。
- 命令行参数:将敏感信息作为启动参数传入。
- 挂载为文件卷:将 Secret 内容映射到容器文件系统。
- 通过 API 动态读取:应用代码直接访问 Kubernetes API 获取敏感数据。
🧱 实践建议
- 安全性依赖 etcd:Secret 数据在 etcd 中是 Base64 编码存储,必须启用加密和访问控制。
- 命名空间限制:Pod 与 Secret 必须在同一个 Namespace 中。
- 不可变配置:支持
immutable: true,防止被修改。 - 敏感信息专用:不要用 ConfigMap 存储密码或证书,必须用 Secret。
📝 使用示例
apiVersion: v1
kind: Secret
metadata:
name: dotfile-secret
data:
.secret-file: dmFsdWUtMg0KDQo= # Base64 编码后的内容
---
apiVersion: v1
kind: Pod
metadata:
name: secret-dotfiles-pod
spec:
volumes:
- name: secret-volume
secret:
secretName: dotfile-secret
containers:
- name: dotfile-test-container
image: registry.k8s.io/busybox
command:
- ls
- "-l"
- "/etc/secret-volume"
volumeMounts:
- name: secret-volume
readOnly: true
mountPath: "/etc/secret-volume"
👉 这个 Pod 会通过环境变量使用数据库密码,并挂载 TLS 证书文件。
⚠️ 注意事项
- 大小限制:单个 Secret 不超过 1 MiB。
- Base64 编码 ≠ 加密:需要额外启用 etcd 加密。
- 命名空间限制:Pod 和 Secret 必须在同一个命名空间。
- 不可变选项:支持
immutable: true,避免误改。
💡 总结
- Secret 是 Kubernetes 的 保险柜。
- 用于保存敏感数据(密码、证书、Token)。
- 与 ConfigMap 类似,但专注于安全性。

浙公网安备 33010602011771号