在云原生时代,Kubernetes 已经成为了广泛应用的容器编排工具。然而,随着云原生应用规模的扩大,应用程序的敏感数据保护成为了一个更加紧迫的问题。 Kubernetes 的 Secret 对象提供了一种在 Kubernetes 中保护应用程序敏感数据的方法。本文将介绍如何使用 Secret 来保护应用程序的敏感数据,并提供示例代码。
Secret 对象
在 Kubernetes 中,Secret 对象用于存储敏感数据,例如密码、API 密钥和证书等。Secret 对象通常使用 Base64 编码,以确保数据在传输时不可读。理论上,Secret 对象可以存储多种数据类型,但是建议只存储敏感数据类型。不同于 ConfigMap 对象,Secret 对象是完全加密的。
在 Kubernetes 集群中创建 Secret 对象有两种方式:
1. 使用 kubectl
使用 kubectl create secret
命令可以在 Kubernetes 中创建 Secret 对象。该命令使用以下语法:
kubectl create secret <type> <secret-name> <data|file> --namespace=<namespace>
type
- Secret 对象类型。 目前 Kubernetes 支持Opaque
、kubernetes.io/dockerconfigjson
和kubernetes.io/tls
三种类型。secret-name
- Secret 对象名称。data|file
- 使用 Base64 编码的敏感数据或存储该数据的文件路径。namespace
- Secrets 创建的命名空间。默认为 default。
例如,以下命令创建一个用于存储数据库密码的 Secret:
$ kubectl create secret generic db-password --from-literal=password=securepassword
这将创建一个名为 db-password
的 Secret 对象,其中包含名为 password
的数据项,其值为 "securepassword"。
2. 使用 YAML 配置文件
创建 Secret 对象的另一种方法是使用 YAML 配置文件。下面是一个 YAML 文件示例:
apiVersion: v1 kind: Secret metadata: name: db-password data: password: c2VjdXJlcGFzc3dvcmQ=
可以使用 kubectl apply
命令创建 Secret 对象:
$ kubectl apply -f secret.yaml
这将创建一个名为 db-password
的 Secret 对象,其中包含名为 password
的数据项,其值为 "securepassword"。
在应用程序中使用 Secret
创建 Secret 对象后,如何在应用程序中使用它呢? Kubernetes 提供了多种方式将 Secret 对象的值注入到容器中。
环境变量
在应用程序中将 Secret 对象的值注入到环境变量中是一种常见的方法。通过 Kubernetes 的 env
属性设置容器的环境变量,可以使用以下 YAML 配置文件示例来将存储在 db-password
Secret 对象中的密码注入到环境变量中:
-- -------------------- ---- ------- ----------- -- ----- --- --------- ----- --- ----- ----------- - ----- -------------- ------ ---------- ---- - ----- ----------- ---------- ------------- ----- ----------- ---- --------
在上面的 YAML 配置文件中,我们指定 Secret 对象的名称为 db-password
,密钥的名称为 password
。然后,我们将 DB_PASSWORD
环境变量设置为 db-password
Secret 对象的 password
密钥的值。
应用程序可以通过 $DB_PASSWORD
环境变量使用密码,例如:
const connect = require('connect'); const app = connect(); const password = process.env.DB_PASSWORD; // 使用连接字符串连接 DB
卷
另一种将 Secret 对象的值注入到容器中的方法是通过 Kubernetes 的卷挂载机制。在 yaml
配置文件中使用 volumeMounts
属性将 Secret 对象的值挂载到容器中。以下 YAML 配置文件示例演示了如何将存储在 db-password
Secret 对象中的密码挂载到容器中的 /etc/db-password
目录:
-- -------------------- ---- ------- ----------- -- ----- --- --------- ----- --- ----- ----------- - ----- -------------- ------ ---------- ------------- - ----- ------------- ---------- ---------------- --------- ---- -------- - ----- ------------- ------- ----------- -----------
在上面的 YAML 配置文件中,我们指定了要挂载的 Secret 对象的名称为 db-password
。然后,我们将 secret-volume
卷挂载到容器中的 /etc/db-password
目录上,以使其可由应用程序访问。
在 Kubernetes Service 中使用 Secret
将 Secret 对象注入到应用程序中非常有用,但是如何确保 Secret 对象在多个 Pod 中共享?这可以通过 Kubernetes Service 实现。Kubernetes Services 可用于将请求路由到在多个 Pod 上运行的应用程序实例。
下面的 YAML 配置文件示例演示了如何将存储在名为 db-password
的 Secret 对象中的密码注入到 Kubernetes 的 Service 中:
-- -------------------- ---- ------- ----------- -- ----- ------- --------- ----- --- ----- --------- ---- ------- ------ - ----- ---- --------- --- ----- -- ----------- ---- ----- ------------ --------------- --------- ------------------------- - --------- ------------------------ ------------------------------------------------------ ----------------------------------------------------------------------------------- -------------------------------------------------------------- ----- ---- - ----------- ----------- ------ - ---------------- - -----------
在上面的 YAML 配置文件中,我们指定了 Secret 对象的名称为 db-password
。然后,我们将该 Secret 对象注入到用于 Kubernetes Service 的 TLS 配置中。
在应用程序中,可以使用以下 Node.js 代码示例来访问该密码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- ----- -- - -------------- ----- ----- - ----------------- ----- ---------- - ----------------------------------------- -------- ----- ----------- - ------------------------------------------ -------- ----- -- - ---------------------------------------- -------- ----- ------- - - ---- ----------- ----- ------------ --- --- ----------- ----------------------- -- ----- ------ - --------------------------- -----
结论
在 Kubernetes 中使用 Secret 对象保护应用程序的敏感数据是一种非常安全的方法。通过创建 Secret 对象、使用环境变量和卷挂载将其注入到容器中,并在 Kubernetes Service 中使用,可以使应用程序更加安全和可靠。 了解和应用这些方法,在开发应用程序和云原生应用中,将是非常重要的技能。
示例代码
YAML 配置文件
以下 YAML 配置文件示例演示了如何创建名为 db-password
的 Secret 对象:
apiVersion: v1 kind: Secret metadata: name: db-password data: password: c2VjdXJlcGFzc3dvcmQ=
以下 YAML 配置文件示例演示了如何将存储在名为 db-password
的 Secret 对象中的密码注入到 Kubernetes 的 Service 中:
-- -------------------- ---- ------- ----------- -- ----- ------- --------- ----- --- ----- --------- ---- ------- ------ - ----- ---- --------- --- ----- -- ----------- ---- ----- ------------ --------------- --------- ------------------------- - --------- ------------------------ ------------------------------------------------------ ----------------------------------------------------------------------------------- -------------------------------------------------------------- ----- ---- - ----------- ----------- ------ - ---------------- - -----------
Node.js 代码
以下 Node.js 代码示例演示了如何将存储在 db-password
Secret 对象中的密码注入到 Node.js 应用程序中:
const connect = require('connect'); const app = connect(); const password = process.env.DB_PASSWORD; // 使用连接字符串连接 DB
以下 Node.js 代码示例演示了如何将存储在名为 db-password
的 Secret 对象中的密码注入到 HTTPS 服务器中:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- ----- -- - -------------- ----- ----- - ----------------- ----- ---------- - ----------------------------------------- -------- ----- ----------- - ------------------------------------------ -------- ----- -- - ---------------------------------------- -------- ----- ------- - - ---- ----------- ----- ------------ --- --- ----------- ----------------------- -- ----- ------ - --------------------------- -----
以上是在 Kubernetes 中使用 Secret 保护应用程序敏感数据的详细说明和示例代码。希望本文可以对您有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670bce6e66ef9cf37fac56c8