在 Kubernetes 应用程序开发中,我们经常需要上传一些敏感的信息或数据,例如 API 密钥、数据库密码等。将这些信息硬编码在代码中或者使用明文存储是不安全且容易泄漏的,因此我们需要一种更加安全的方式来管理这些数据。在 Kubernetes 中,最常见的做法是使用 Secret。本文将介绍在 Kubernetes 中如何使用 Secret 管理敏感数据。
Secret 概述
Secret 是一种 Kubernetes 对象类型,用于存储敏感数据,如密码、令牌和证书等。Secret 中的数据以加密的方式存储,并可以安全地传递到 Pod 中。Secret 可以被挂载到容器的文件系统中,以便应用程序可以访问这些数据。
Secret 具有以下特点:
- Secret 中的数据以加密的方式存储。
- Secret 仅适用于容器内部和 Kubernetes 集群内部的通信。
- Secret 可以跨命名空间使用。
- Secret 可以自动注入到 Pod 中。
创建 Secret
在 Kubernetes 中,可以使用 kubectl 命令或者 YAML 文件来创建 Secret。
使用 kubectl 命令创建 Secret
使用以下 kubectl 命令可以创建一个 Secret:
$ kubectl create secret generic my-secret --from-literal=username=my-username --from-literal=password=my-password
上述命令使用两个字符串 my-username
和 my-password
来创建名为 my-secret
的 Secret。可以通过取回 my-secret
对象来查看 Secret 中的数据:
$ kubectl get secret my-secret -o jsonpath='{.data}'
Secret 中的数据被存储为 base64 编码的字符串。
使用 YAML 文件创建 Secret
以下是一个应用程序的 YAML 文件,其中包括一个 Secret 来存储敏感数据:
apiVersion: v1 kind: Secret metadata: name: my-secret type: Opaque data: username: bXktc3ViamVjdG9uZw== password: bXktcGFzc3dvcmQ=
与使用命令行命令一样,Secret 中的数据也被存储为 base64 编码的字符串。可以使用以下命令来应用上述 YAML 文件:
$ kubectl apply -f my-secret.yaml
在 Pod 中使用 Secret
Pod 中可以使用以下方法来使用 Secret 中存储的数据:
挂载到文件系统中
可以将 Secret 挂载到容器的文件系统中,以便应用程序可以访问这些数据。在 Pod 中定义一个 volume,然后将 Secret 挂载到该 volume 中。在容器中,将 volume 挂载到指定的路径。
以下是一个使用了 Secret 的 Pod 的 YAML 文件的示例:
-- -------------------- ---- ------- ----------- -- ----- --- --------- ----- ------ ----- ----------- - ----- ------------ ------ -------- ------------- - ----- ---------------- ---------- -------------- --------- ---- -------- - ----- ---------------- ------- ----------- ---------
在上面的示例中,Secret my-secret
被挂载到 my-container
容器中的 /etc/my-secret
目录。
通过环境变量传递
可以直接将 Secret 中的值传递到容器的环境变量中,以便应用程序可以访问这些数据。在容器中,使用 $VAR_NAME
形式的环境变量来引用这些值。
以下是一个使用了 Secret 的 Pod 的 YAML 文件的另一个示例:
-- -------------------- ---- ------- ----------- -- ----- --- --------- ----- ------ ----- ----------- - ----- ------------ ------ -------- ---- - ----- -------- ---------- ------------- ----- --------- ---- -------- - ----- -------- ---------- ------------- ----- --------- ---- --------
在上面的示例中,Secret my-secret
中的值被传递给两个环境变量 USERNAME
和 PASSWORD
。在容器中,这两个环境变量可通过 $USERNAME
和 $PASSWORD
引用。
Secret 的最佳实践
最后,以下是一些使用 Secret 的最佳实践:
- 不要直接在 YAML 文件中存储敏感数据,而是使用
kubectl create secret
命令来创建 Secret。 - 不要在容器中直接使用 Secret 中的明文数据,而是使用挂载到文件系统或者传递到环境变量中的方式。
- 使用不同的 Secret 对象来存储不同类型的敏感数据,例如 API 密钥和数据库密码。
- 定期轮换 Secret 中的敏感数据,并跟踪 Secret 的使用和分发情况。
结论
本文介绍了在 Kubernetes 中使用 Secret 管理敏感数据,并且演示了如何创建和使用 Secret。我们还讨论了 Secret 的最佳实践。Secret 是一种安全而有用的 Kubernetes 对象,可用于存储敏感数据并与 Pod 共享。通过使用 Secret,可以保护敏感数据不受未经授权的访问,并使其更加安全。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6773b6516d66e0f9aae6c4ea