Secrets 属性源

Kubernetes 提供了名为 Secrets 的概念,用于存储敏感数据,例如密码、OAuth 令牌等。此项目提供了与 `Secrets` 的集成,使 Spring Boot 应用程序能够访问这些 secrets。您可以通过设置 `spring.cloud.kubernetes.secrets.enabled` 属性来显式启用或禁用此功能。

启用后,`Fabric8SecretsPropertySource` 将从以下来源在 Kubernetes 中查找 `Secrets`

  1. 递归读取 secrets 挂载点

  2. 以应用程序名称命名(由 `spring.application.name` 定义)

  3. 匹配某些标签

注意

出于安全原因,默认情况下,**不会启用**通过 API 使用 Secrets(上述第 2 点和第 3 点)。secrets 上的“list”权限允许客户端检查指定命名空间中 secrets 的值。此外,我们建议容器通过挂载卷共享 secrets。

如果启用通过 API 使用 Secrets,我们建议您使用授权策略(例如 RBAC)来限制对 Secrets 的访问。有关通过 API 使用 Secrets 时风险和最佳实践的更多信息,请参阅 此文档

如果找到 secrets,则其数据将提供给应用程序。

假设我们有一个名为 `demo` 的 Spring Boot 应用程序,它使用属性来读取其数据库配置。我们可以使用以下命令创建一个 Kubernetes secret:

kubectl create secret generic db-secret --from-literal=username=user --from-literal=password=p455w0rd

上述命令将创建以下 secret(您可以使用 `kubectl get secrets db-secret -o yaml` 查看):

apiVersion: v1
data:
  password: cDQ1NXcwcmQ=
  username: dXNlcg==
kind: Secret
metadata:
  creationTimestamp: 2017-07-04T09:15:57Z
  name: db-secret
  namespace: default
  resourceVersion: "357496"
  selfLink: /api/v1/namespaces/default/secrets/db-secret
  uid: 63c89263-6099-11e7-b3da-76d6186905a8
type: Opaque

请注意,数据包含 `create` 命令提供的文本的 Base64 编码版本。

然后,您的应用程序可以使用此 secret,例如,通过将 secret 的值导出为环境变量:

apiVersion: v1
kind: Deployment
metadata:
  name: ${project.artifactId}
spec:
   template:
     spec:
       containers:
         - env:
            - name: DB_USERNAME
              valueFrom:
                 secretKeyRef:
                   name: db-secret
                   key: username
            - name: DB_PASSWORD
              valueFrom:
                 secretKeyRef:
                   name: db-secret
                   key: password

您可以通过多种方式选择要使用的 Secrets:

  1. 列出 secrets 映射到的目录

    -Dspring.cloud.kubernetes.secrets.paths=/etc/secrets/db-secret,etc/secrets/postgresql

    如果所有 secrets 都映射到一个公共根目录,您可以像这样设置它们:

    -Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
  2. 设置命名的 secret

    -Dspring.cloud.kubernetes.secrets.name=db-secret
  3. 定义标签列表

    -Dspring.cloud.kubernetes.secrets.labels.broker=activemq
    -Dspring.cloud.kubernetes.secrets.labels.db=postgresql

与 `ConfigMap` 一样,也可以使用多个 `Secret` 实例进行更高级的配置。`spring.cloud.kubernetes.secrets.sources` 列表使这成为可能。例如,您可以定义以下 `Secret` 实例:

spring:
  application:
    name: cloud-k8s-app
  cloud:
    kubernetes:
      secrets:
        name: default-name
        namespace: default-namespace
        sources:
         # Spring Cloud Kubernetes looks up a Secret named s1 in namespace default-namespace
         - name: s1
         # Spring Cloud Kubernetes looks up a Secret named default-name in namespace n2
         - namespace: n2
         # Spring Cloud Kubernetes looks up a Secret named s3 in namespace n3
         - namespace: n3
           name: s3

在前面的示例中,如果未设置 `spring.cloud.kubernetes.secrets.namespace`,则将在应用程序运行的命名空间中查找名为 `s1` 的 `Secret`。请参阅 命名空间解析,以更好地了解如何解析应用程序的命名空间。

与 `ConfigMaps` 类似;如果希望应用程序在无法加载 `Secrets` 属性源时启动失败,可以设置 `spring.cloud.kubernetes.secrets.fail-fast=true`。

还可以为 `Secret` 属性源启用重试 类似于 `ConfigMaps`。与 `ConfigMap` 属性源一样,首先需要设置 `spring.cloud.kubernetes.secrets.fail-fast=true`。然后,您需要将 `spring-retry` 和 `spring-boot-starter-aop` 添加到您的类路径中。`Secret` 属性源的重试行为可以通过设置 `spring.cloud.kubernetes.secrets.retry.*` 属性来配置。

如果由于某种原因您已经在类路径中拥有 `spring-retry` 和 `spring-boot-starter-aop`,并且想要启用快速失败,但不想启用重试;您可以通过设置 `spring.cloud.kubernetes.secrets.retry.enabled=false` 来禁用 `Secrets` `PropertySources` 的重试。

由于来自 Secrets 的数据通常被视为敏感数据,因此可以使执行器端点 `/env` 和 `/configprops` 对数据进行清理,以便不会以纯文本显示。为此,您需要设置:

spring.cloud.kubernetes.sanitize.secrets=true

此设置自 `3.0.6` 及更高版本起受支持。

表 1. 属性
名称 类型 默认值 描述

spring.cloud.kubernetes.secrets.enabled

布尔值

true

启用 Secrets `PropertySource`

spring.cloud.kubernetes.secrets.name

字符串

${spring.application.name}

设置要查找的 secret 的名称

spring.cloud.kubernetes.secrets.namespace

字符串

客户端命名空间

设置要在其中查找的 Kubernetes 命名空间

spring.cloud.kubernetes.secrets.labels

映射

null

设置用于查找 secrets 的标签

spring.cloud.kubernetes.secrets.paths

列表

null

设置 secrets 挂载的路径(示例 1)

spring.cloud.kubernetes.secrets.enableApi

布尔值

false

启用或禁用通过 API 使用 secrets(示例 2 和 3)

spring.cloud.kubernetes.secrets.fail-fast

布尔值

false

启用或禁用在加载 `Secret` 时发生错误时使应用程序启动失败

spring.cloud.kubernetes.secrets.retry.enabled

布尔值

true

启用或禁用 secrets 重试。

spring.cloud.kubernetes.secrets.retry.initial-interval

长整型

1000

初始重试间隔(毫秒)。

spring.cloud.kubernetes.secrets.retry.max-attempts

整型

6

最大尝试次数。

spring.cloud.kubernetes.secrets.retry.max-interval

长整型

2000

回退的最大间隔。

spring.cloud.kubernetes.secrets.retry.multiplier

双精度浮点型

1.1

下一个间隔的乘数。

备注

  • `spring.cloud.kubernetes.secrets.labels` 属性的行为如 基于映射的绑定 中所定义。

  • `spring.cloud.kubernetes.secrets.paths` 属性的行为如 基于集合的绑定 中所定义。

  • 出于安全原因,可能限制通过 API 访问 secrets。首选方法是将 secrets 挂载到 Pod。

您可以在 spring-boot-camel-config 中找到一个使用 secrets 的应用程序示例(尽管它尚未更新为使用新的 `spring-cloud-kubernetes` 项目)