跳到主要内容
版本:5.0.1

Secrets PropertySource

DeepSeek V3 中英对照 Secrets PropertySource

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

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

  1. 从 secrets 挂载中递归读取

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

  3. 匹配某些标签

注意:

默认情况下,出于安全考虑,通过API使用Secret(上述第2点和第3点)未被启用。对Secret的'list'权限允许客户端检查指定命名空间中的Secret值。此外,我们建议容器通过挂载卷来共享Secret。

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

如果找到密钥,其数据将可供应用程序使用。

假设我们有一个名为 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 编码版本。

然后,您的应用程序就可以使用这个密钥了——例如,通过将密钥的值导出为环境变量:

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

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

  1. 通过设置命名密钥:

    -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,则会在应用程序运行的命名空间中查找名为 s1 的 Secret。请参阅 namespace-resolution 以更好地理解如何解析应用程序的命名空间。

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

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

备注

如果你由于某些原因已经在 classpath 中包含了 spring-retry 和 spring-boot-starter-aspectj,并且希望启用快速失败(fail-fast),但又不希望启用重试功能;你可以通过设置 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.enabledBooleantrue启用 Secrets PropertySource
spring.cloud.kubernetes.secrets.nameString${spring.application.name}设置要查找的 Secret 的名称
spring.cloud.kubernetes.secrets.namespaceString客户端命名空间设置要查找的 Kubernetes 命名空间
spring.cloud.kubernetes.secrets.labelsMapnull设置用于查找 Secret 的标签
spring.cloud.kubernetes.secrets.fail-fastBooleanfalse在加载 Secret 发生错误时,启用或禁用应用程序启动失败
spring.cloud.kubernetes.secrets.retry.enabledBooleantrue启用或禁用 Secret 重试。
spring.cloud.kubernetes.secrets.retry.initial-intervalLong1000初始重试间隔(毫秒)。
spring.cloud.kubernetes.secrets.retry.max-attemptsInteger6最大尝试次数。
spring.cloud.kubernetes.secrets.retry.max-intervalLong2000退避的最大间隔。

Notes:

  • spring.cloud.kubernetes.secrets.labels 属性的行为遵循 基于 Map 的绑定 的定义。

  • 出于安全原因,通过 API 访问 Secret 可能会受到限制。推荐的方式是将 Secret 挂载到 Pod 上。

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