在 Kubernetes 中使用 Secret 保护应用数据

阅读时长 11 分钟读完

在云原生时代,Kubernetes 已经成为了广泛应用的容器编排工具。然而,随着云原生应用规模的扩大,应用程序的敏感数据保护成为了一个更加紧迫的问题。 Kubernetes 的 Secret 对象提供了一种在 Kubernetes 中保护应用程序敏感数据的方法。本文将介绍如何使用 Secret 来保护应用程序的敏感数据,并提供示例代码。

Secret 对象

在 Kubernetes 中,Secret 对象用于存储敏感数据,例如密码、API 密钥和证书等。Secret 对象通常使用 Base64 编码,以确保数据在传输时不可读。理论上,Secret 对象可以存储多种数据类型,但是建议只存储敏感数据类型。不同于 ConfigMap 对象,Secret 对象是完全加密的。

在 Kubernetes 集群中创建 Secret 对象有两种方式:

1. 使用 kubectl

使用 kubectl create secret 命令可以在 Kubernetes 中创建 Secret 对象。该命令使用以下语法:

  • type - Secret 对象类型。 目前 Kubernetes 支持 Opaquekubernetes.io/dockerconfigjsonkubernetes.io/tls 三种类型。
  • secret-name - Secret 对象名称。
  • data|file - 使用 Base64 编码的敏感数据或存储该数据的文件路径。
  • namespace - Secrets 创建的命名空间。默认为 default。

例如,以下命令创建一个用于存储数据库密码的 Secret:

这将创建一个名为 db-password 的 Secret 对象,其中包含名为 password 的数据项,其值为 "securepassword"。

2. 使用 YAML 配置文件

创建 Secret 对象的另一种方法是使用 YAML 配置文件。下面是一个 YAML 文件示例:

可以使用 kubectl apply 命令创建 Secret 对象:

这将创建一个名为 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 环境变量使用密码,例如:

另一种将 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 对象:

以下 YAML 配置文件示例演示了如何将存储在名为 db-password 的 Secret 对象中的密码注入到 Kubernetes 的 Service 中:

-- -------------------- ---- -------
----------- --
----- -------
---------
  ----- ---
-----
  ---------
    ---- -------
  ------
  - ----- ----
    --------- ---
    ----- --
    ----------- ----
  ----- ------------
  --------------- ---------
  -------------------------
    - ---------
  ------------------------
    ------------------------------------------------------ -----------------------------------------------------------------------------------
    -------------------------------------------------------------- -----
  ----
    - ----------- -----------
      ------
      - ----------------
      - -----------

Node.js 代码

以下 Node.js 代码示例演示了如何将存储在 db-password Secret 对象中的密码注入到 Node.js 应用程序中:

以下 Node.js 代码示例演示了如何将存储在名为 db-password 的 Secret 对象中的密码注入到 HTTPS 服务器中:

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------
----- -- - --------------
----- ----- - -----------------
----- ---------- - ----------------------------------------- --------
----- ----------- - ------------------------------------------ --------
----- -- - ---------------------------------------- --------
----- ------- - -
  ---- -----------
  ----- ------------
  --- ---
  ----------- -----------------------
--
----- ------ - --------------------------- -----

以上是在 Kubernetes 中使用 Secret 保护应用程序敏感数据的详细说明和示例代码。希望本文可以对您有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670bce6e66ef9cf37fac56c8

纠错
反馈