Secrets PropertySource

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

启用后,Fabric8SecretsPropertySource 会从以下来源查找 Kubernetes 的 Secrets

  1. 递归地从 secret 挂载中读取

  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. 通过设置命名 secret

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

    -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,则将在应用程序运行的命名空间中查找名为 s1Secret。请参阅 namespace-resolution 以更好地了解应用程序命名空间的解析方式。

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

也可以为 Secret 属性源启用重试 就像 ConfigMaps 一样。与 ConfigMap 属性源一样,首先您需要设置 spring.cloud.kubernetes.secrets.fail-fast=true。然后您需要在 classpath 中添加 spring-retryspring-boot-starter-aspectjSecret 属性源的重试行为可以通过设置 spring.cloud.kubernetes.secrets.retry.* 属性来配置。

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

由于来自 Secrets 的数据通常被视为敏感数据,因此可以将 actuator 的 /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

Map

null

设置用于查找 secrets 的标签

spring.cloud.kubernetes.secrets.fail-fast

布尔值

当加载 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 属性的行为遵循 基于 Map 的绑定 的定义。

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

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

© . This site is unofficial and not affiliated with VMware.