Kubernetes 具有用于存储的 Secrets 的概念 敏感数据,例如密码、OAuth 令牌等。此项目提供与 make secrets 的集成 可通过 Spring Boot 应用程序访问。可以通过设置属性来显式启用或禁用此功能。Secretsspring.cloud.kubernetes.secrets.enabledSpring中文文档

启用后,将从以下来源查找 Kubernetes:Fabric8SecretsPropertySourceSecretsSpring中文文档

  1. 从机密挂载中递归读取Spring中文文档

  2. 以应用程序命名(定义如下:spring.application.name)Spring中文文档

  3. 匹配某些标签Spring中文文档

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

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

如果找到机密,则其数据将提供给应用程序。Spring中文文档

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

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

前面的命令将创建以下机密(您可以使用以下命令查看):kubectl get secrets db-secret -o yamlSpring中文文档

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

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

然后,应用程序可以使用此密钥 — 例如,通过将密钥的值导出为环境变量:Spring中文文档

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

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

  1. 通过列出映射机密的目录:Spring中文文档

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

    如果将所有密钥映射到公共根目录,则可以按以下方式设置它们:Spring中文文档

    -Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
  2. 通过设置命名密钥:Spring中文文档

    -Dspring.cloud.kubernetes.secrets.name=db-secret
  3. 通过定义标签列表:Spring中文文档

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

与 的情况一样,还可以使用多个实例进行更高级的配置。该列表使这成为可能。 例如,您可以定义以下实例:ConfigMapSecretspring.cloud.kubernetes.secrets.sourcesSecretSpring中文文档

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

在前面的示例中,如果尚未设置, 将在应用程序运行的命名空间中查找命名。 请参阅 namespace-resolution 以更好地了解命名空间如何 的申请已解决。spring.cloud.kubernetes.secrets.namespaceSecrets1Spring中文文档

类似于 ConfigMaps;如果希望应用程序无法启动 当它无法加载属性源时,可以设置 。Secretsspring.cloud.kubernetes.secrets.fail-fast=trueSpring中文文档

也可以对属性源(如 ConfigMaps)启用重试。 与属性源一样,首先需要设置 。 然后,您需要将 和 添加到您的类路径中。 可以通过设置属性来配置属性源的重试行为。SecretConfigMapspring.cloud.kubernetes.secrets.fail-fast=truespring-retryspring-boot-starter-aopSecretspring.cloud.kubernetes.secrets.retry.*Spring中文文档

如果您由于某种原因已经拥有 和 在类路径上 并希望启用快速失败,但不希望启用重试;您可以通过设置 来禁用重试。spring-retryspring-boot-starter-aopSecretsPropertySourcesspring.cloud.kubernetes.secrets.retry.enabled=false
如果您由于某种原因已经拥有 和 在类路径上 并希望启用快速失败,但不希望启用重试;您可以通过设置 来禁用重试。spring-retryspring-boot-starter-aopSecretsPropertySourcesspring.cloud.kubernetes.secrets.retry.enabled=false

由于来自机密的数据通常被视为敏感数据,因此可以对执行器的端点进行清理,使其不以纯文本形式显示。为此,您需要设置:/env/configpropsSpring中文文档

spring.cloud.kubernetes.sanitize.secrets=true

此设置自此及更高版本均受支持。3.0.6Spring中文文档

表 1.性能:
名字 类型 违约 描述

spring.cloud.kubernetes.secrets.enabledSpring中文文档

BooleanSpring中文文档

trueSpring中文文档

启用密钥PropertySourceSpring中文文档

spring.cloud.kubernetes.secrets.nameSpring中文文档

StringSpring中文文档

${spring.application.name}Spring中文文档

设置要查找的密钥的名称Spring中文文档

spring.cloud.kubernetes.secrets.namespaceSpring中文文档

StringSpring中文文档

客户端命名空间Spring中文文档

设置要查找的 Kubernetes 命名空间Spring中文文档

spring.cloud.kubernetes.secrets.labelsSpring中文文档

MapSpring中文文档

nullSpring中文文档

设置用于查找机密的标签Spring中文文档

spring.cloud.kubernetes.secrets.pathsSpring中文文档

ListSpring中文文档

nullSpring中文文档

设置挂载密钥的路径(示例 1)Spring中文文档

spring.cloud.kubernetes.secrets.enableApiSpring中文文档

BooleanSpring中文文档

falseSpring中文文档

通过 API 启用或禁用使用密钥(示例 2 和 3)Spring中文文档

spring.cloud.kubernetes.secrets.fail-fastSpring中文文档

BooleanSpring中文文档

falseSpring中文文档

启用或禁用在加载SecretSpring中文文档

spring.cloud.kubernetes.secrets.retry.enabledSpring中文文档

BooleanSpring中文文档

trueSpring中文文档

启用或禁用机密重试。Spring中文文档

spring.cloud.kubernetes.secrets.retry.initial-intervalSpring中文文档

LongSpring中文文档

1000Spring中文文档

初始重试间隔(以毫秒为单位)。Spring中文文档

spring.cloud.kubernetes.secrets.retry.max-attemptsSpring中文文档

IntegerSpring中文文档

6Spring中文文档

最大尝试次数。Spring中文文档

spring.cloud.kubernetes.secrets.retry.max-intervalSpring中文文档

LongSpring中文文档

2000Spring中文文档

退避的最大间隔。Spring中文文档

spring.cloud.kubernetes.secrets.retry.multiplierSpring中文文档

DoubleSpring中文文档

1.1Spring中文文档

下一个间隔的乘数。Spring中文文档

您可以在 spring-boot-camel-config 上找到使用机密的应用程序示例(尽管它尚未更新为使用新项目)spring-cloud-kubernetesSpring中文文档