Kubernetes Secret 是 Kubernetes 系统中用来存储和管理敏感信息的一个对象。这些敏感信息可能包括密码、OAuth tokens、SSH 密钥等。使用 Secret 可以更安全地管理敏感数据,因为它们不是以明文存储在 Pod 的定义中或者容器镜像中,而是以加密形式存放在 Kubernetes API 服务器上。
使用场景
- 存储凭据:用于存储数据库、外部服务的用户名和密码。
- 存储配置信息:如 API 密钥,配置文件等。
- TLS 证书:存储 TLS 证书和私钥。
- Pod 访问控制:给 Pod 提供访问 Kubernetes API 的权限。
使用技巧
- 最小权限原则:确保只有需要访问 Secret 的 Pod 和用户才有权限。
- 定期轮换秘钥:定期更新 Secret 中的敏感数据。
- 避免直接在 Pod 配置中暴露 Secret:使用环境变量或卷挂载的方式引用 Secret。
- 加密 Etcd 数据存储:Kubernetes 存储数据的 Etcd 应该被加密。
- 审计和监控:监控对 Secret 的访问和更改,以及确保审计日志的生成。
使用案例
存储数据库凭据
假设你有一个需要连接到 MySQL 数据库的应用程序,你可以创建一个 Secret 来存储数据库的用户名和密码。
创建 Secret使用以下命令创建一个名为 mysql-secret
的 Secret:
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
username: [base64 encoded username]
password: [base64 encoded password]
其中,[base64 encoded username]
和 [base64 encoded password]
分别是经过 base64 编码的用户名和密码。
在 Pod 中使用 Secret在 Pod 定义中,你可以通过环境变量或卷的方式来使用这个 Secret:
代码语言:javascript复制apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: myapp
env:
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: username
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
在这个案例中,Pod myapp-pod
将会从 mysql-secret
中获取数据库用户名和密码,并设置为环境变量 MYSQL_USER
和 MYSQL_PASSWORD
。