跳到主要内容

Kubernetes Secret 详解

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

什么是 Kubernetes Secret?

Secret 是 Kubernetes 中的一种资源类型,用于存储和管理敏感信息。与 ConfigMap 不同,Secret 中的数据是经过 Base64 编码的,并且 Kubernetes 提供了额外的机制来确保 Secret 的安全性,例如在传输过程中加密存储。

备注

虽然 Secret 中的数据是 Base64 编码的,但这并不是加密。Base64 编码只是一种编码方式,可以轻松解码。因此,Secret 并不是完全安全的,建议结合其他安全措施(如 RBAC、加密存储等)来保护敏感信息。

创建 Secret

你可以通过多种方式创建 Secret,以下是几种常见的方法。

1. 使用 kubectl create secret 命令

你可以使用 kubectl create secret 命令从文件、目录或字面量创建 Secret。

bash
# 从文件创建 Secret
kubectl create secret generic my-secret --from-file=./username.txt --from-file=./password.txt

# 从字面量创建 Secret
kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=secret

2. 使用 YAML 文件创建 Secret

你也可以通过 YAML 文件定义 Secret,然后使用 kubectl apply 命令创建。

yaml
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: YWRtaW4= # Base64 编码的 "admin"
password: c2VjcmV0 # Base64 编码的 "secret"

将上述内容保存为 secret.yaml 文件,然后运行以下命令:

bash
kubectl apply -f secret.yaml

使用 Secret

创建 Secret 后,你可以将其挂载到 Pod 中或作为环境变量使用。

1. 将 Secret 挂载为卷

你可以将 Secret 挂载为 Pod 中的卷,这样容器就可以访问 Secret 中的数据。

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

2. 将 Secret 作为环境变量

你也可以将 Secret 中的数据作为环境变量注入到容器中。

yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: my-secret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password

Secret 的类型

Kubernetes 提供了多种类型的 Secret,每种类型用于不同的场景。

  • Opaque: 默认类型,用于存储任意用户定义的数据。
  • kubernetes.io/service-account-token: 用于存储服务账户令牌。
  • kubernetes.io/dockercfg: 用于存储 Docker 配置文件的 Secret。
  • kubernetes.io/dockerconfigjson: 用于存储 Docker 配置 JSON 文件的 Secret。
  • kubernetes.io/tls: 用于存储 TLS 证书和私钥。

实际案例

假设你正在部署一个需要连接到数据库的应用程序。你可以将数据库的用户名和密码存储在 Secret 中,然后在 Pod 中通过环境变量或挂载卷的方式使用这些信息。

yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # Base64 编码的 "admin"
password: c2VjcmV0 # Base64 编码的 "secret"

然后在 Pod 中引用这个 Secret:

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

总结

Kubernetes Secret 是管理敏感信息的强大工具。通过 Secret,你可以安全地存储和管理密码、API 密钥、TLS 证书等敏感数据,并在 Pod 中以环境变量或挂载卷的方式使用这些数据。虽然 Secret 提供了额外的安全特性,但仍需结合其他安全措施来确保敏感信息的安全性。

附加资源

练习

  1. 创建一个包含用户名和密码的 Secret,并将其挂载到 Pod 中。
  2. 将 Secret 中的数据作为环境变量注入到 Pod 中。
  3. 尝试使用不同类型的 Secret(如 TLS Secret)并观察其行为。

通过以上练习,你将更深入地理解 Kubernetes Secret 的使用方法和最佳实践。