跳到主要内容

Kubernetes Secret

Kubernetes Secret 是一种用于存储和管理敏感信息的资源对象,例如密码、API 密钥、TLS 证书等。与 ConfigMap 类似,Secret 允许你将配置数据与应用程序代码分离,但 Secret 专门用于存储敏感数据,并提供了额外的安全保护措施。

为什么需要 Kubernetes Secret?

在应用程序中,许多敏感信息(如数据库密码、API 密钥等)需要被安全地存储和管理。将这些信息直接硬编码在代码或配置文件中是不安全的,因为它们可能会被意外泄露。Kubernetes Secret 提供了一种安全的方式来存储这些敏感信息,并通过加密和访问控制来保护它们。

Secret 的类型

Kubernetes 支持多种类型的 Secret,以下是一些常见的类型:

  1. Opaque:默认类型,用于存储任意用户定义的数据。
  2. kubernetes.io/service-account-token:用于存储服务账户的令牌。
  3. kubernetes.io/dockercfg:用于存储 Docker 镜像仓库的认证信息。
  4. kubernetes.io/tls:用于存储 TLS 证书和私钥。

创建 Secret

你可以通过命令行或 YAML 文件来创建 Secret。以下是两种常见的方式:

1. 使用命令行创建 Secret

假设你需要存储一个数据库的用户名和密码,可以使用以下命令创建 Secret:

bash
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=secretpassword

2. 使用 YAML 文件创建 Secret

你也可以通过 YAML 文件定义 Secret。以下是一个示例:

yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64 编码的 "admin"
password: c2VjcmV0cGFzc3dvcmQ= # base64 编码的 "secretpassword"
备注

在 YAML 文件中,Secret 的数据字段需要以 base64 编码的形式存储。你可以使用 echo -n "your-data" | base64 来生成 base64 编码的字符串。

使用 Secret

创建 Secret 后,你可以将其挂载到 Pod 中或作为环境变量使用。以下是两种常见的使用方式:

1. 将 Secret 挂载为文件

你可以将 Secret 挂载到 Pod 的文件系统中,应用程序可以通过读取文件来获取敏感信息。以下是一个示例:

yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
volumeMounts:
- name: secret-volume
mountPath: /etc/secret
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: db-secret

在这个示例中,db-secret 中的 usernamepassword 将被挂载到 /etc/secret 目录下,分别作为 usernamepassword 文件。

2. 将 Secret 作为环境变量

你也可以将 Secret 的值作为环境变量注入到容器中。以下是一个示例:

yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password

在这个示例中,db-secret 中的 usernamepassword 将被注入到容器的环境变量 DB_USERNAMEDB_PASSWORD 中。

实际应用场景

场景 1:存储数据库凭据

假设你有一个需要连接到 MySQL 数据库的应用程序。你可以将数据库的用户名和密码存储在 Secret 中,并在部署时将其注入到应用程序中。这样可以避免将敏感信息硬编码在代码或配置文件中。

场景 2:存储 TLS 证书

如果你的应用程序需要使用 HTTPS,你可以将 TLS 证书和私钥存储在 Secret 中,并在部署时将其挂载到 Pod 中。这样可以确保证书的安全存储和管理。

总结

Kubernetes Secret 是一种强大的工具,用于安全地存储和管理敏感信息。通过将敏感数据与应用程序代码分离,你可以提高应用程序的安全性,并简化配置管理。无论是存储数据库凭据、API 密钥还是 TLS 证书,Secret 都能帮助你轻松应对这些需求。

附加资源

练习

  1. 创建一个名为 api-secret 的 Secret,存储一个 API 密钥。
  2. api-secret 挂载到一个 Pod 中,并验证应用程序是否可以正确读取该密钥。
  3. 尝试将 api-secret 作为环境变量注入到 Pod 中,并验证应用程序是否可以正确读取该密钥。

通过完成这些练习,你将更好地理解 Kubernetes Secret 的使用方法和实际应用场景。