在 Kubernetes Secret 中存储数据

本主题介绍了如何将敏感数据存储在 Kubernetes Secret 中,以及如何通过 API 代理流中的流变量检索数据。

简介

有时候,您想要在运行时存储数据以供检索,但不过期的数据不应在 API 代理逻辑中进行硬编码。一种方式是使用混合 键值对映射 (KVM) 功能。 如果您已在针对敏感数据的自定义保险柜中使用 Kubernetes 进行密钥管理,则可能需要考虑使用本主题中的 Kubernetes Secret 功能说明。与 KVM 数据一样,您可以访问 API 代理流变量中的 Kubernetes Secret 数据。

哪些类型的数据存储在 Kubernetes Secret 中?

Apigee Hybrid 限制您在 Kubernetes Secret 中存储以下类型的数据文件。具体包括:

文件格式 支持的文件扩展名
TLS 证书和密钥文件 *.crt*.key*.pem
属性文件 *.properties

属性文件是包含键值对的文件。例如:

username=admin
password=1f2d1e2e7df

创建 Kubernetes Secret

本部分介绍如何创建用于存储集群中的敏感数据的 Kubernetes Secret。

  1. 创建文件或者您想要存储在 Kubernetes Secret 中的文件。文件必须是一种受支持的格式,文件扩展列在 哪些类型的数据可存储在 Kubernetes Secret 中
  2. 执行 kubectl create secret generic 命令:例如:
    kubectl -n namespace create secret generic org-env-policy-secret \
      --from-file=filepath/prop-file.properties \
      --from-file=filepath/key-file.key \
      --from-file="filepath/cert-file.pem
    

    其中:

    • namespace:部署运行时组件的 Kubernetes 命名空间。
    • org:您的 Apigee 组织名称。
    • env:您组织中的环境的名称。
    • filepath:您要在密钥中添加的文件的路径。您必须至少指定一个要在密钥中添加的文件。
    • prop-file:要在密钥中添加的属性文件的名称。
    • key-file:要在密钥中添加的 TLS 密钥文件的名称。
    • cert-file:要在密钥中添加的 TLS 证书文件的名称。

    您可以在密钥中添加一个或多个文件。例如:

    kubectl -n apigee create secret generic myorg-test-policy-secret \
      --from-file="$policy_secrets_path"/credential.properties \
      --from-file="$policy_secrets_path"/secrets.properties \
      --from-file="$policy_secrets_path"/public.key \
      --from-file="$policy_secrets_path"/fullchain.pem
    
  3. 创建后,此更改最多可能需要 90 秒才能反映在所有集群中。消息处理器每 30 秒轮询一次密钥更改。如果检测到更改,缓存即会更新。

从密钥中检索数据

密钥创建完毕并可用(通常在创建后约 90 秒钟)后,您可以在存储密钥的组织/环境中的 API 代理流中访问流变量中的密钥数据。例如,假设您的密钥包含一个名为 credentials.properties*.properties 文件,其中包含 API 密钥,如下所示:

apikey=OrxYQptBMlY1TqmiGLTtyFiaLzzrD25Z

然后,您可以使用分配消息政策从流变量中检索 API 密钥。例如:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>my-apikey</Name>
    <Ref>private.secret.credential.properties.apikey</Ref>
  </AssignVariable>
</AssignMessage>

Ref 元素引用的变量名称 private.secret.credential.properties.apikey 由以下部分组成:

变量名称部分 说明
private.secret 变量的固定命名空间。存储在混合集群中的所有 Kubernetes Secret 共用此命名空间。
credential.properties 存储在 Kubernetes Secret 中的文件的名称。
apikey 存储在属性文件中的密钥的名称。

在此示例中,“分配消息”政策弃用了 apikeyOrxYQptBMlY1TqmiGLTtyFiaLzzrD25Z,并将其存储在流变量 my-apikey 中。

更新密钥

由于 kubectl 不支持更新 Kubernetes Secret,您必须先删除现有密钥,然后按照 创建 Kubernetes Secret 中的步骤重新创建该密钥。