机密 PropertySource

Kubernetes 具有用于存储 敏感数据,例如密码、OAuth 令牌等。该项目提供与Secrets制作 secret 可由 Spring Boot 应用程序访问。您可以通过设置spring.cloud.kubernetes.secrets.enabled财产。spring-doc.cadn.net.cn

启用后,Fabric8SecretsPropertySource在 Kubernetes 中查找Secrets来自以下来源:spring-doc.cadn.net.cn

  1. 从 secrets 挂载中递归读取spring-doc.cadn.net.cn

  2. 以应用程序命名(由spring.application.name)spring-doc.cadn.net.cn

  3. 匹配一些标签spring-doc.cadn.net.cn

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

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

如果找到密钥,则其数据将可供应用程序使用。spring-doc.cadn.net.cn

假设我们有一个名为demo它使用 properties 来读取其数据库 配置。我们可以使用以下命令创建 Kubernetes 密钥:spring-doc.cadn.net.cn

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

前面的命令将创建以下密钥(您可以使用kubectl get secrets db-secret -o yaml):spring-doc.cadn.net.cn

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命令。spring-doc.cadn.net.cn

然后,您的应用程序可以使用此密钥 — 例如,通过将密钥的值导出为环境变量:spring-doc.cadn.net.cn

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-doc.cadn.net.cn

  1. 通过列出映射 secret 的目录:spring-doc.cadn.net.cn

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

    如果您已将所有密钥映射到一个公共根,则可以像这样设置它们:spring-doc.cadn.net.cn

    -Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
  2. 通过设置命名密钥:spring-doc.cadn.net.cn

    -Dspring.cloud.kubernetes.secrets.name=db-secret
  3. 通过定义标签列表:spring-doc.cadn.net.cn

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

ConfigMap,在您可以使用多个Secret实例。这spring.cloud.kubernetes.secrets.sourcesList 使这成为可能。 例如,您可以定义以下内容Secret实例:spring-doc.cadn.net.cn

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未定, 这Secrets1将在应用程序运行的命名空间中查找。 请参阅 namespace-resolution 以更好地了解命名空间 的申请已解决。spring-doc.cadn.net.cn

ConfigMaps;如果您希望应用程序无法启动 当无法加载时Secretsproperty sources 中,您可以设置spring.cloud.kubernetes.secrets.fail-fast=true.spring-doc.cadn.net.cn

也可以为Secret属性源就像ConfigMaps. 与ConfigMapproperty 源,首先需要设置spring.cloud.kubernetes.secrets.fail-fast=true. 然后你需要添加spring-retryspring-boot-starter-aop添加到您的 Classpath 中。 重试行为Secret属性源可以通过设置spring.cloud.kubernetes.secrets.retry.*性能。spring-doc.cadn.net.cn

如果您已经拥有spring-retryspring-boot-starter-aop由于某种原因,在 Classpath 上 并希望启用快速失败,但不希望启用重试;您可以对Secrets PropertySources通过设置spring.cloud.kubernetes.secrets.retry.enabled=false.

由于来自 Secrets 的数据通常被视为敏感数据,因此 Actuator 的 endpoints/env/configprops可以清理数据,使其不以纯文本显示。为此,您需要设置:spring-doc.cadn.net.cn

spring.cloud.kubernetes.sanitize.secrets=true

支持此设置,因为3.0.6和向上。spring-doc.cadn.net.cn

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

spring.cloud.kubernetes.secrets.enabledspring-doc.cadn.net.cn

Booleanspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

启用 SecretPropertySourcespring-doc.cadn.net.cn

spring.cloud.kubernetes.secrets.namespring-doc.cadn.net.cn

Stringspring-doc.cadn.net.cn

${spring.application.name}spring-doc.cadn.net.cn

设置要查找的 secret 的名称spring-doc.cadn.net.cn

spring.cloud.kubernetes.secrets.namespacespring-doc.cadn.net.cn

Stringspring-doc.cadn.net.cn

客户端命名空间spring-doc.cadn.net.cn

设置要查找的 Kubernetes 命名空间spring-doc.cadn.net.cn

spring.cloud.kubernetes.secrets.labelsspring-doc.cadn.net.cn

Mapspring-doc.cadn.net.cn

nullspring-doc.cadn.net.cn

设置用于查找密钥的标签spring-doc.cadn.net.cn

spring.cloud.kubernetes.secrets.pathsspring-doc.cadn.net.cn

Listspring-doc.cadn.net.cn

nullspring-doc.cadn.net.cn

设置 secret 的挂载路径(示例 1)spring-doc.cadn.net.cn

spring.cloud.kubernetes.secrets.enableApispring-doc.cadn.net.cn

Booleanspring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

启用或禁用通过 API 使用密钥(示例 2 和 3)spring-doc.cadn.net.cn

spring.cloud.kubernetes.secrets.fail-fastspring-doc.cadn.net.cn

Booleanspring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

启用或禁用在加载Secretspring-doc.cadn.net.cn

spring.cloud.kubernetes.secrets.retry.enabledspring-doc.cadn.net.cn

Booleanspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

启用或禁用密钥重试。spring-doc.cadn.net.cn

spring.cloud.kubernetes.secrets.retry.initial-intervalspring-doc.cadn.net.cn

Longspring-doc.cadn.net.cn

1000spring-doc.cadn.net.cn

初始重试间隔(以毫秒为单位)。spring-doc.cadn.net.cn

spring.cloud.kubernetes.secrets.retry.max-attemptsspring-doc.cadn.net.cn

Integerspring-doc.cadn.net.cn

6spring-doc.cadn.net.cn

最大尝试次数。spring-doc.cadn.net.cn

spring.cloud.kubernetes.secrets.retry.max-intervalspring-doc.cadn.net.cn

Longspring-doc.cadn.net.cn

2000spring-doc.cadn.net.cn

回退的最大间隔。spring-doc.cadn.net.cn

spring.cloud.kubernetes.secrets.retry.multiplierspring-doc.cadn.net.cn

Doublespring-doc.cadn.net.cn

1.1spring-doc.cadn.net.cn

下一个间隔的乘数。spring-doc.cadn.net.cn

您可以找到一个使用 Secret 的应用程序示例(尽管它尚未更新为使用新的spring-cloud-kubernetes项目)位于 spring-boot-camel-configspring-doc.cadn.net.cn