Secret 的详细介绍
Secret 是 Kubernetes 中用于存储和管理敏感信息(如密码、令牌、密钥等)的资源对象。Secret的设计目的是为了安全地存储和传输敏感信息,如密码、API密钥、证书等。这些信息通常不应该直接硬编码在配置文件或镜像中,而应通过Secret进行管理和使用。
1. Secret 的核心特性
• 敏感数据存储 :存储密码、API 密钥、TLS 证书、SSH 密钥等。
• 与 Pod 解耦 :Secret 独立于 Pod 定义,避免敏感信息硬编码。
• Base64 编码 :数据默认以 Base64 编码存储(非加密,需配合集群安全策略)。
• 类型化支持 :支持多种预定义类型(如 Opaque
、docker-registry
、tls
等)。
2. Secret 的常见类型
类型 | 用途 |
---|---|
Opaque |
默认类型,存储任意用户定义的敏感数据(键值对)。 |
kubernetes.io/dockerconfigjson |
存储 Docker 镜像仓库的认证信息(用于 docker pull 鉴权)。 |
kubernetes.io/tls |
存储 TLS 证书和私钥(用于 HTTPS 服务)。 |
kubernetes.io/service-account-token |
服务账号令牌,用于 Pod 与 API Server 的认证。 |
3. 创建 Secret 的常用方法
(1) 通过 kubectl
命令行创建
bash
# 从文件创建(自动 Base64 编码)
kubectl create secret generic my-secret \
--from-file=username=./username.txt \
--from-file=password=./password.txt
# 从字面量创建
kubectl create secret generic my-secret \
--from-literal=username=admin \
--from-literal=password='S!B\*d$zDsb='
# 创建 Docker 仓库认证 Secret
kubectl create secret docker-registry regcred \
--docker-server=registry.example.com \
--docker-username=admin \
--docker-password=123456 \
[email protected]
(2) 通过 YAML 文件定义
yaml
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque # 默认为 Opaque
data:
username: YWRtaW4= # Base64 编码的 "admin"
password: UyFCX2R6RHNiPQ== # Base64 编码的 "S!B_d$zDsb="
(3) API
Kubernetes提供了丰富的API接口,可以通过编程方式创建和管理Secret。
4. 在 Pod 中使用 Secret
(1) 作为环境变量
yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: my-secret # Secret 名称
key: username # Secret 中的键
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
(2) 挂载为 Volume 文件
yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mycontainer
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/secret"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: my-secret # Secret 名称
# 可选:指定 keys,默认挂载所有键
items:
- key: username
path: my-username # 文件名为 my-username
- key: password
path: my-password
(3) 命令行参数
敏感数据也可以作为命令行参数传递给容器,但这种方式相对容易在日志或命令行界面中暴露,因此应谨慎使用。
5. Secret 的安全管理
• 加密存储 :
• 默认情况下,Secret 数据以 Base64 编码存储在 etcd 中,未加密。
• 启用 etcd 加密 或使用 KMS 提供商 实现静态加密(需配置 Kubernetes 集群)。
• RBAC 控制 :
通过 Role-Based Access Control (RBAC) 限制对 Secret 的访问权限。
• 最小权限原则 :
仅向 Pod 和用户授予必要的 Secret 访问权限。
6. 最佳实践
-
避免将 Secret 提交到版本控制系统
使用 CI/CD 工具动态注入 Secret,或通过 Secret 管理工具(如 HashiCorp Vault)。
-
限制 Secret 的暴露范围
• 使用
volumeMount
而非环境变量(环境变量可能被日志记录)。• 为不同服务分配不同的 Secret。
-
定期轮换 Secret
更新 Secret 后,重启相关 Pod 以加载新数据(若使用环境变量需重启 Pod,Volume 挂载可能自动更新)。
-
使用 TLS Secrets 保护通信
为 Ingress 或 Service 配置 TLS 证书。
7. 与 ConfigMap 的区别
特性 | Secret | ConfigMap |
---|---|---|
数据类型 | 敏感信息(Base64 编码) | 非敏感配置(明文) |
典型用途 | 密码、令牌、密钥 | 配置文件、命令行参数、环境变量 |
存储安全 | 建议加密存储 | 无需加密 |
YAML 字段 | data (Base64)或 stringData (明文) |
data (明文) |
8. 示例:使用 TLS Secret 配置 HTTPS
yaml
apiVersion: v1
kind: Secret
metadata:
name: tls-secret
type: kubernetes.io/tls
data:
tls.crt: <Base64 编码的证书>
tls.key: <Base64 编码的私钥>
# 在 Ingress 中引用
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
tls:
- hosts:
- example.com
secretName: tls-secret
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
通过合理使用 Secret,可以显著提升 Kubernetes 应用的安全性,确保敏感信息在存储、传输和使用过程中的机密性。
9. 拓展
【一起来学kubernetes】19、Pod使用详解
【一起来学kubernetes】11、Deployment使用详解